javascript foreach查找和更新

时间:2017-07-05 16:06:39

标签: javascript foreach find lodash

假设我有一个树类型数据数组

[ { 'id': 1, 'name': 'root', 'parent_id': 1 },
  { 'id': 2, 'name': 'level 1', 'parent_id': 1 },
  { 'id': 3, 'name': 'level 2', 'parent_id': 1 },
  { 'id': 4, 'name': 'level 2.1', 'parent_id': 3 } ]

是否可以将数组更新为

[ { 'id': 1, 'name': 'root', 'parent_id': 1, 'parent_name': 'root' },
  { 'id': 2, 'name': 'level 1', 'parent_id': 1, 'parent_name': 'root' },
  { 'id': 3, 'name': 'level 2', 'parent_id': 1, 'parent_name': 'root' },
  { 'id': 4, 'name': 'level 2.1', 'parent_id': 3, 'parent_name': 'level 2' } ]

使用lodash forEach并找到?

_.forEach(arr, function (o) {
  let item = _.find(arr, {'id': o.parent_id})
  o.parent_name = item.name
})

我的问题在于forEach的功能,它不知道arr是什么,我让它用for循环替换forEach。

for (i = 0; i < arr.length; i++) {
  let item = _.find(arr, {'id': arr[i].parent_id})
  arr[i].parent_name = item.name
}

所以想知道是否有更优雅的方式来实现这个

3 个答案:

答案 0 :(得分:1)

这是使用哈希来提高性能来解决问题的另一种方法:

let hash = _.keyBy(data, 'id');

这将创建一个对象,其中键是id:

{
    1: { id: 1, name: 'root' ... },
    2: { id: 2, name: 'level 1' ... },
    ...
}

然后迭代数据以使用散列设置parent_name

_.each(data, item => item.parent_name = _.get(hash, [item.parent_id, 'name']));

答案 1 :(得分:0)

尝试阅读_.forEach上的文档。

  

使用三个参数调用iteratee:(value,index | key,collection)。

您需要设置forEach,如此:

_.forEach(arr, function (o, idx, arr) {
      let item = _.find(arr, {'id': o.parent_id})
      o.parent_name = item.name
});

答案 2 :(得分:0)

您可以使用.map将对象更改为 -

const arr =[ { 'id': 1, 'name': 'root', 'parent_id': 1 },
  { 'id': 2, 'name': 'level 1', 'parent_id': 1 },
  { 'id': 3, 'name': 'level 2', 'parent_id': 1 },
  { 'id': 4, 'name': 'level 2.1', 'parent_id': 3 } ];

const newArr = arr.map((item) => {
  if(name === 'root') return Object.assign({}, item, {parent_name: 'root'});
  const findIndexOfParent = arr.findIndex((pItem) => pItem.id == item.parent_id);
  if(findIndexOfParent > -1){
    return Object.assign({}, item, {parent_name: arr[findIndexOfParent].name});
  }
});

console.log(newArr);