57 lines
1.4 KiB
JavaScript
57 lines
1.4 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
var _require = require('../helpers/is'),
|
||
|
isArray = _require.isArray,
|
||
|
isObject = _require.isObject;
|
||
|
|
||
|
module.exports = function flatten(depth) {
|
||
|
var flattenDepth = depth || Infinity;
|
||
|
|
||
|
var fullyFlattened = false;
|
||
|
var collection = [];
|
||
|
|
||
|
var flat = function flat(items) {
|
||
|
collection = [];
|
||
|
|
||
|
if (isArray(items)) {
|
||
|
items.forEach(function (item) {
|
||
|
if (isArray(item)) {
|
||
|
collection = collection.concat(item);
|
||
|
} else if (isObject(item)) {
|
||
|
Object.keys(item).forEach(function (property) {
|
||
|
collection = collection.concat(item[property]);
|
||
|
});
|
||
|
} else {
|
||
|
collection.push(item);
|
||
|
}
|
||
|
});
|
||
|
} else {
|
||
|
Object.keys(items).forEach(function (property) {
|
||
|
if (isArray(items[property])) {
|
||
|
collection = collection.concat(items[property]);
|
||
|
} else if (isObject(items[property])) {
|
||
|
Object.keys(items[property]).forEach(function (prop) {
|
||
|
collection = collection.concat(items[property][prop]);
|
||
|
});
|
||
|
} else {
|
||
|
collection.push(items[property]);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
fullyFlattened = collection.filter(function (item) {
|
||
|
return isObject(item);
|
||
|
});
|
||
|
fullyFlattened = fullyFlattened.length === 0;
|
||
|
|
||
|
flattenDepth -= 1;
|
||
|
};
|
||
|
|
||
|
flat(this.items);
|
||
|
|
||
|
while (!fullyFlattened && flattenDepth > 0) {
|
||
|
flat(collection);
|
||
|
}
|
||
|
|
||
|
return new this.constructor(collection);
|
||
|
};
|