【问题标题】:Writing a recursive search function to return a object;编写递归搜索函数返回一个对象;
【发布时间】:2019-11-04 20:16:01
【问题描述】:

我正在尝试编写一个搜索函数,该函数可以搜索对象数组的数组并返回名称中包含搜索字符串的任何对象。

我遇到的问题是对象数组可以包含一个子数组,而子数组也可以有一个子数组。我需要动态搜索所有可能的孩子并返回结果

我曾尝试使用 Algolia 来执行此操作,但由于文件结构不会不断更新,我觉得使用 Array.includes 或类似的东西会更好

我尝试了以下功能,但似乎无法正常工作

  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"
      }
   ]
]

【问题讨论】:

  • 还请包括您迄今为止尝试过的内容。你的例子对我来说就像 Json。
  • 更新了我正在尝试使用的功能
  • 是的,我明白了,但是我如何在不知道对象中有多少孩子或孩子的孩子的情况下搜索所有可能的孩子和孩子的孩子

标签: javascript arrays angular google-cloud-firestore


【解决方案1】:

一个简单的递归函数将允许您从每个嵌套(无论多深)对象中收集对象(或对象的任何属性)。

您应该考虑区分大小写是否也很重要。

否则,这将起作用:

  • 在数据中搜索任何带有“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);

【讨论】:

    【解决方案2】:

    您可以尝试如下递归函数来检查数组和子数组以获得结果。

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

    【讨论】:

      猜你喜欢
      • 2023-02-02
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      相关资源
      最近更新 更多