javascript foreach найти и обновить

1

Скажем, у меня есть массив данных типа дерева

[ { '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(arr, function (o) {
  let item = _.find(arr, {'id': o.parent_id})
  o.parent_name = item.name
})

моя проблема находится внутри функции forEach, она не знает, что такое arr, я получил ее, заменив forEach на простой цикл.

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

Поэтому интересно, есть ли еще более элегантный способ достичь этого

Теги:
find
foreach
lodash

3 ответа

1
Лучший ответ

Вот еще один способ решить вашу проблему с помощью хэша для повышения производительности:

let hash = _.keyBy(data, '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']));
  • 0
    Возможно, parent_id одного из объектов не существует, например, в ваших данных parent_id из 6 вернет ошибку, которую вы получили. Изменили код, чтобы использовать функцию get lodash для удовлетворения этого случая.
  • 0
    Спасибо, это именно то, что произошло!
0

Попробуйте прочитать документацию на _.forEach.

Итератор вызывается с тремя аргументами: (значение, индекс | ключ, коллекция).

Вам нужно настроить ваш forEach следующим образом:

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

вы можете использовать.map для изменения объекта as-

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню