#javascript #arrays #nested
#javascript #массивы #вложенный
Вопрос:
У меня есть массив объектов, в котором каждый объект имеет внутренний массив объекта, который, в свою очередь, снова имеет внутренний массив объектов, он может перейти на любой уровень внутреннего объекта, который я хочу отфильтровать и отобразить.
obj = [{ name: "apple", subGroups: [{ name: "apple-a", subGroups: { name: "apple-b", subGroups: [{ name: "apple-c", subGroups: { name: "apple-d", subGroups:[]}}]}}]}
{ name: "orange", subGroups: [{ name: "orange-a", subGroups: { name: "orange-b", subGroups: [{ name: "orange-c", subGroups: { name: "orange-d", subGroups:[]}}]}}]}
{ name: "mango", subGroups: [{ name: "123", subGroups: []}]}
{ name: "grapes", subGroups: [{ name: "123", subGroups: []}]}
{ name: "pear", subGroups: [{ name: "123", subGroups: []}]}]
значение поиска является динамическим ‘orange-d’ ,
searchvalue = 'orange-d';
result = { name: "orange-d", subGroups:[]}
const newArr = obj.map(obj => {
return obj.name === searchvalue;
}).flat();
Я пробовал с помощью filter, map, flat, но мне не удалось найти результат, пожалуйста, помогите
Комментарии:
1. пожалуйста, добавьте желаемый результат. почему
subGroups
массив или объект?2. вы хотите получить только один объект в качестве результата?
Ответ №1:
Вы могли бы взять Array#flatMap
с предыдущей проверкой переданный массив или объект, как если бы это следовало позже как subGroups
.
const
find = (array, name) => (Array.isArray(array) ? array : [array])
.flatMap(o => o.name === name ? o : find(o.subGroups, name)),
data = [{ name: "apple", subGroups: [{ name: "apple-a", subGroups: { name: "apple-b", subGroups: [{ name: "apple-c", subGroups: { name: "apple-d", subGroups: [] } }] } }] }, { name: "orange", subGroups: [{ name: "orange-a", subGroups: { name: "orange-b", subGroups: [{ name: "orange-c", subGroups: { name: "orange-d", subGroups: [] } }] } }] }, { name: "mango", subGroups: [{ name: "123", subGroups: [] }] }, { name: "grapes", subGroups: [{ name: "123", subGroups: [] }] }, { name: "pear", subGroups: [{ name: "123", subGroups: [] }] }],
result = find(data, 'orange-d');
console.log(result);
Ответ №2:
примечание: вероятно, было бы лучше, если бы вы пересмотрели эту рекурсивную структуру. для решения вы должны использовать какую-то рекурсию, например:
var obj = [
{ name: "apple", subGroups: [
{ name: "apple-a", subGroups: [
{ name: "apple-b", subGroups: [
{ name: "apple-c", subGroups: [
{ name: "apple-d", subGroups:[]}
]}
]}
]}
]},
{ name: "orange", subGroups: [
{ name: "orange-a", subGroups: [
{ name: "orange-b", subGroups: [
{ name: "orange-c", subGroups: [
{ name: "orange-d", subGroups:[]}
]}
]}
]}
]},
{ name: "mango", subGroups: [
{ name: "123", subGroups: []}
]},
{ name: "grapes", subGroups: [
{ name: "123", subGroups: []}
]},
{ name: "pear", subGroups: [
{ name: "123", subGroups: []}
]}
];
var searchvalue = 'orange-d';
function findName(array, name) {
let result = {};
if(!(Array.isArray(array) amp;amp; array.length))
return resu<
for(let item of array) {
if(item.name === name) return item;
result = findName(item.subGroups, name);
if (result amp;amp; result.name === name) return resu<
}
return resu<
}
console.log(findName(obj, searchvalue));