как искать значение из массива объектов внутри массива объектов?

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