javascript - 在具有完整结构完整性的 JSON 树中搜索
问题描述
我认为这是在过滤嵌套树对象而不丢失结构之前被问到的
但我正在寻找的是相反的。
对于 JSON 数据
var items = [
{
name: "a1",
id: 1,
children: [{
name: "a2",
id: 2,
children: [{
name: "a3",
id: 3
}]
},
{
name: "b2",
id: 5,
children: [{
name: "a4",
id: 4
}]
}]
}
];
我们需要过滤器,以便如果您搜索a2
. 它应该返回以下内容
var items = [
{
name: "a1",
id: 1,
children: [{
name: "a2",
id: 2,
children: [{
name: "a3",
id: 3
}]
}]
}
];
即该树路径中的所有节点(从根到叶节点)。
知道如何在 nodejs/javascript 中实现吗?
谢谢
解决方案
以下解决方案使用object-scan。
注意:(1)输入未发生变异(2)array -> children
预期表现良好的表单输入。
// const objectScan = require('object-scan');
const finder = (name, input) => objectScan(['**(^children$).name'], {
abort: true,
useArraySelector: false,
filterFn: ({ key, value, context, parents }) => {
if (value !== name) {
return false;
}
let cur = context;
for (let idx = 0; idx < key.length - 1; idx += 1) {
const segment = key[idx];
if (idx % 2 === 0) {
cur.push({ ...parents[parents.length - 1 - idx][segment] });
cur = cur[0];
} else {
cur[segment] = [];
cur = cur[segment];
}
}
return true;
}
})(input, []);
const items = [{ name: 'a1', id: 1, children: [{ name: 'a2', id: 2, children: [{ name: 'a3', id: 3 }] }, { name: 'b2', id: 5, children: [{ name: 'a4', id: 4 }] }] }];
console.log(finder('a2', items));
// => [ { name: 'a1', id: 1, children: [ { name: 'a2', id: 2, children: [ { name: 'a3', id: 3 } ] } ] } ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.8.0"></script>
免责声明:我是对象扫描的作者
推荐阅读
- docker - 从 Hashicorp-Vault 服务器获取 .env 变量,在本地机器上运行 Docker 映像
- html - 具有行跨度的单元格中的文本框不应用宽度值
- javascript - 如何从 react-google-maps/api 获取可编辑折线的更新路径?
- r-markdown - 使用 bookdown book 中定义和说明的自定义块
- inheritance - 将具体课程定为最终课程是一种好习惯吗?
- python - TypeError:“节点”和“节点”的实例之间不支持“<”
- ios - Firebase 函数 iOS:响应不是字典
- java - 我将如何计算这个算法的大 O
- javascript - 对象方法定义的方括号语法
- azure - Azure AD B2C MFA 计费