首页 > 解决方案 > 在具有完整结构完整性的 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 中实现吗?

谢谢

标签: javascriptjsonnode.jssearchfilter

解决方案


以下解决方案使用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>

免责声明:我是对象扫描的作者


推荐阅读