javascript foreach查找和更新

javascript foreach查找和更新,javascript,foreach,find,lodash,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': 'roo

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

[ { '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和find

_.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
}
for(i=0;i

因此,想知道是否有更优雅的方法来实现这一点

请尝试阅读上的文档

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
});

您可以使用.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);

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

let hash = _.keyBy(data, 'id');
这将创建一个对象,其中键是id:

{
    1: { id: 1, name: 'root' ... },
    2: { id: 2, name: 'level 1' ... },
    ...
}
然后只需在数据上迭代,使用散列设置
parent\u name

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

可能其中一个对象的
parent\u id
不存在,例如,在您的数据中,parent\u id为6将返回您获取的错误。已将代码更改为使用lodash的
get
功能来满足该情况。谢谢,事情就是这样发生的!