首页 > 解决方案 > 在 Javascript 中的嵌套对象中查找分支

问题描述

在过去的两个小时内,我试图为我的问题找到解决方案,其中包括尝试自己、扫描 lodash 文档以及 SO 以获得任何合适的答案,但没有提出任何远程工作或实用的方法。我将非常感谢您的帮助。

我有一个可以是任何深度的对象。

例如

{
  "name": "alpha",
  "children": [
    {
      "name": "beta",
      "children": [
        {
          "name": "gamma",
          "children": [
            {
              "name": "delta",
              "children": []
            }
          ]
        }
      ]
    },
    {
      "name": "epsilon",
      "children": [
        {
          "name": "zeta",
          "children": [
            {
              "name": "eta",
              "children": []
            }
          ]
        }
      ]
    }
  ]
}

我正在寻找一个函数,它将返回这个对象的整个分支,其中有一个匹配的名称(如果可能没有 lodash,但如果真的需要它就可以了)。

给定'gamma'我希望它返回的输入


{
  "name": "alpha",
  "children": [
    {
      "name": "beta",
      "children": [
        {
          "name": "gamma",
          "children": [
            {
              "name": "delta",
              "children": []
            }
          ]
        }
      ]
    }
  ]
}

给定一个输入't',我希望它返回整个对象,因为它包含在两个分支的孩子的名字中。

标签: javascriptobjectfilterlodash

解决方案


您可以将此问题分为两部分,首先让我们测试名称是否存在于树中:

function hasStr(item, str) {
  return item.name.includes(str) || item.children.some(x => hasStr(x, str));
}

hasStr(item, 'gamma'); // true

您还要求有一个函数返回传递的对象并仅返回过滤后的子项:

function possibleAnswer(item, str) {
  return {
    name: item.name,
    children: item.children.filter(x => hasStr(x, str)),
  };
}

possibleAnswer(item, 'gamma'); // will return desired object

推荐阅读