извлечь из массива со вложенностью элемент
есть массив с вложенными массивами groups. Нужно получить имя элемента из groups при условии, что group.code === code. Как это сделать ?
const arr =
[
{"id":"1","code":"111","name":"обувь","groups":[
{"id":"12","code":"123","name":"кроссовки"},
{"id":"2","code":"234","name":"туфли"}]},
{"id":"13","code":"222","name":"одежда", "groups":[
{"id":"15","code":"345","name":"брюки"},
{"id":"17","code":"456","name":"джинсы"}
]
}
]
const code = "456"
Мое решение находит нужный элемент, но я не знаю, как получить только имя
console.log(arr.find(el => el.groups.find(gr => gr.code === code)))
Ответы (3 шт):
Автор решения: peperoneen
→ Ссылка
console.log(arr.find(el => el.groups.find(gr => gr.code === code)).name)
Автор решения: Pavel Nazarian
→ Ссылка
const arr =
[
{"id":"1","code":"111","name":"обувь","groups":[
{"id":"12","code":"123","name":"кроссовки"},
{"id":"2","code":"234","name":"туфли"}]},
{"id":"13","code":"222","name":"одежда", "groups":[
{"id":"15","code":"345","name":"брюки"},
{"id":"17","code":"456","name":"джинсы"}
]
}
]
const code = "345";
let name = arr.reduce((res,el) => {
res = el.groups.find(item => item.code == code);
if (res != undefined) return res.name;
},'')
console.log(name);
Автор решения: Eugene X
→ Ссылка
Если там дерево в дереве в дереве то я сначала разделал бы дерево в линейку. И просто прошел-бы фильтром. Мне кажется это наибыстрейший вариант. От Object.values и {} если подумать, то можно избавиться. Просто в редюсер передать массив [] и return будет после obj.push(val)
https://codepen.io/latdev/pen/QWMzaRG
function reduceALL(obj, val) {
if ((val.groups instanceof Array) && val.groups.length) {
val.groups.reduce(reduceALL, obj);
}
obj[val.id] = val;
return obj;
}
const result = Object.values(arr.reduce(reduceALL, {})).filter(x => x.code === code).map(x => x.name);
=== Дополнено ===
function reduceALL(obj, val) {
if ((val.groups instanceof Array) && val.groups.length) {
val.groups.reduce(reduceALL, obj);
}
obj.push(val);
return obj;
}
const result = arr.reduce(reduceALL, []).filter(x => x.code === code).map(x => x.name);