在 Javascript 中的嵌套 Object 中查找分支

Find branches in nested Object in Javascript

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

我有一个 object 可以是任何深度。

例如

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

我正在寻找一个函数,它将 return 这个 object 的整个分支,其中有一个匹配的名称(如果可能的话没有 lodash 但如果真的需要它没问题)。

输入 'gamma' 我希望它 return


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

给定输入 't' 我希望它 return 整个 object,因为它包含在两个分支的 children 的名称中。

这个问题可以用递归来解决,因为不知道深度。

getNames = (nameChild, match) => {
     if (nameChild.length < 1) return false;

     if (nameChild.name.includes(match)) return true;

     k =  nameChild.children
                   .filter((child) => 
                         getNames(child, match)) 
     return (k.length > 0) ? k : false; 
}

假设对象被分配给 nameObj 变量然后

nameObj.children = getNames(nameObj, 'zeta');

这将完成工作!

你可以把这个问题分成两部分,首先让我们测试树中是否存在名称:

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

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

您还要求有一个函数,该函数 return 是传递的对象并且 return 只是子对象的过滤版本:

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

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