Скажем, у меня есть массив данных типа дерева
[ { '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
}
Поэтому интересно, есть ли еще более элегантный способ достичь этого
Вот еще один способ решить вашу проблему с помощью хэша для повышения производительности:
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']));
Попробуйте прочитать документацию на _.forEach.
Итератор вызывается с тремя аргументами: (значение, индекс | ключ, коллекция).
Вам нужно настроить ваш forEach
следующим образом:
_.forEach(arr, function (o, idx, arr) {
let item = _.find(arr, {'id': o.parent_id})
o.parent_name = item.name
});
вы можете использовать.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);
parent_id
одного из объектов не существует, например, в ваших данных parent_id из 6 вернет ошибку, которую вы получили. Изменили код, чтобы использовать функциюget
lodash для удовлетворения этого случая.