在 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
在过去的两个小时里,我试图找到解决我的问题的方法,其中包括自己尝试、扫描 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