Написание рекурсивной функции поиска для возврата объекта; - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь написать функцию поиска, которая может выполнять поиск в массиве массивов объектов и возвращать любые объекты, которые включают в себя строку поиска в имени.

Проблема, с которой я столкнулся, состоит в том, что массив объектов может содержать массив потомков, а потомки также могут иметь массив потомков.Мне нужно динамически искать по всем возможным дочерним элементам и возвращать результаты

Я пытался сделать это с помощью Algolia, но поскольку структура файлов не будет постоянно обновляться, я чувствую, что было бы лучше использовать Array.include иличто-то похожее

Я пробовал следующую функцию, но не могу заставить ее работать

  searchArray(subMenuItems, name) {
    if (subMenuItems) {
      for (let i = 0; i < subMenuItems.length; i++) {
        if (subMenuItems.includes(name)) {
          return subMenuItems[i];
        }
        const found = this.getSubItem(subMenuItems[i].children, name);
        if (found) {
          return found;
        }
      }
    }
  }

Вот пример массива объектов

[
   [
      {
         "children":[
            {
               "children":[
                  {
                     "fileSize":"1.2MB",
                     "fileUrl":"https://linktoPDF.com",
                     "name":"GF Kitchen ",
                     "type":"file"
                  }
               ],
               "name":"Ground Floor Kitchen",
               "type":"folder"
            }
         ],
         "name":"House",
         "type":"folder"
      }
   ],
   [
      {
         "fileSize":"1.3MB",
         "fileUrl":"https://linktoPDF.com",
         "name":"Introduction and Overview",
         "type":"file"
      },
      {
         "fileSize":"20MB",
         "fileUrl":"https://linktoPDF.com",
         "name":"VISUAL iPad Location Drawing",
         "type":"file"
      },
      {
         "fileSize":"1MB",
         "fileUrl":"https://linktoPDF.com",
         "name":"Control Surface",
         "type":"file"
      },
      {
         "fileSize":"1.3MB",
         "fileUrl":"https://linktoPDF.com",
         "name":"Scene",
         "type":"file"
      }
   ]
]

Ответы [ 2 ]

0 голосов
/ 22 июня 2019

Вы можете попробовать рекурсивную функцию, как показано ниже, чтобы проверить массив и дочерний массив, чтобы получить результат.

function searchByName(obj, name) {
  if (Array.isArray(obj)) {
    return obj.reduce((acc, item) => acc.concat(searchByName(item, name)), []);
  }
  if (typeof obj === 'object') {
    const matched = [];
    const { children, ...rest } = obj;
    if (obj.name && obj.name.includes(name)) {
      matched.push(rest);
    }
    return Array.isArray(children) ?
      matched.concat(searchByName(children, name)) : matched;
  }
  return;
}

const arr = [[{"children":[{"children":[{"fileSize":"1.2MB","fileUrl":"https://linktoPDF.com","name":"GF Kitchen","type":"file"}],"name":"Ground Floor Kitchen","type":"folder"}],"name":"House","type":"folder"}],[{"fileSize":"1.3MB","fileUrl":"https://linktoPDF.com","name":"Introduction and Overview","type":"file"},{"fileSize":"20MB","fileUrl":"https://linktoPDF.com","name":"VISUAL iPad Location Drawing","type":"file"},{"fileSize":"1MB","fileUrl":"https://linktoPDF.com","name":"Control Surface","type":"file"},{"fileSize":"1.3MB","fileUrl":"https://linktoPDF.com","name":"Scene","type":"file"}]];

console.log(searchByName(arr, 'not found'));
console.log(searchByName(arr, 'Drawing'));
console.log(searchByName(arr, 'S'));
0 голосов
/ 22 июня 2019

Простая рекурсивная функция позволит вам собрать объекты (или любое свойство объекта) из каждого из вложенных (независимо от того, насколько глубоко) объектов.

Вы должны рассмотреть, является ли чувствительность к регистру чем-то, чтотоже важно.

В противном случае, это будет работать:

  • Поиск данных по любому имени с помощью 'ce'
  • , а затем поиск по любому имени с помощью'tion '
  • , затем найдите любое имя с помощью 'Floor'

const data = [[{"children":[{"children":[{"fileSize":"1.2MB","fileUrl":"https://linktoPDF.com","name":"GF Kitchen","type":"file"}],"name":"Ground Floor Kitchen","type":"folder"}],"name":"House","type":"folder"}],[{"fileSize":"1.3MB","fileUrl":"https://linktoPDF.com","name":"Introduction and Overview","type":"file"},{"fileSize":"20MB","fileUrl":"https://linktoPDF.com","name":"VISUAL iPad Location Drawing","type":"file"},{"fileSize":"1MB","fileUrl":"https://linktoPDF.com","name":"Control Surface","type":"file"},{"fileSize":"1.3MB","fileUrl":"https://linktoPDF.com","name":"Scene","type":"file"}]];
let output = [];

function search(arr, str) {
  arr.forEach(a => {
    if (a.constructor == Array) {
      search(a, str);
    } else if (a.children) {
      if (a.name.includes(str)) output.push(a);
      search(a.children, str);
    } else {
      if (a.name.includes(str)) output.push(a);
    }

  });
}
search(data, 'ce');
console.log(output);
output = [];
search(data, 'tion');
console.log(output);
output = [];
search(data, 'Floor');
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...