我正在寻找一个看起来像这样的数组:
[{
"id": 0,
"text": "item 0"
}, {
"id": 1,
"items": [{
"id": 2,
"text": "item 2"
}, {
"id": 3,
"items": [{
"id": 4,
"text": "item 4"
}]
}]
}]
进入这个
[{
"id": 0,
"text": "item 0"
}, {
"id": 2,
"text": "item 2"
}, {
"id": 4,
"text": "item 4"
}]
基本上保留所有没有“items”属性的元素,如果它们有一个,则以递归方式遍历所有“items”数组。
我确实可以写一个递归函数,但我正在寻找一个漂亮的lodash或下划线方法来解决这个问题。
答案 0 :(得分:5)
在lodash或下划线中没有这个功能。我认为递归函数是你最好的选择:
function collect(array, result) {
array.forEach(function(el) {
if(el.items) {
collect(el.items, result);
} else {
result.push(el);
}
});
}
var array = [{
"id": 0,
"text": "item 0"
}, {
"id": 1,
"items": [{
"id": 2,
"text": "item 2"
}, {
"id": 3,
"items": [{
"id": 4,
"text": "item 4"
}]
}]
}];
function collect(array, result) {
array.forEach(function(el) {
if(el.items) {
collect(el.items, result);
} else {
result.push(el);
}
});
}
var result = [];
collect(array, result);
console.log(result);

答案 1 :(得分:0)
lodash/flattenDeep将递归展平数组。例如:
import {flattenDeep} from 'lodash'
const nestedArray = [1, ['2', [3, [{x: 4}]]]]
const mixedNestedArray = [1, ['2', [3, [{x: [[4]]}]]]]
console.log(flattenDeep(nestedArray)) // [1, '2', 3, {x: 4}]
console.log(flattenDeep(mixedNestedArray)) // [1, '2', 3, {x: [[4]]}]
请注意,对象内的嵌套数组不会受到影响,这正是您所期望的。
答案 2 :(得分:-1)
2 行代码的可能解决方案,使用 lodash/flatMap:
const iteratee = item => (item.items ? flatMap(item.items, iteratee) : item);
const flattenedItems = _.flatMap(sourceItems, iteratee);
从我的头顶写下来,所以把它带上一粒盐。