使用lodash

时间:2016-09-02 17:37:49

标签: javascript underscore.js lodash flatten flatmap

我正在寻找一个看起来像这样的数组:

[{
    "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或下划线方法来解决这个问题。

3 个答案:

答案 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);

从我的头顶写下来,所以把它带上一粒盐。