javascript - JavaScript 中 JSON 的过滤级别递归保留子级

标签 javascript json recursion

我正在尝试在所有级别上过滤 JavaScript 中的 JSON。我想根据每个条目是否存在于数组中来保留每个级别的每个条目的“名称”。如果它没有达到某个级别,请继续通过子级。

接受的名称:

var accepted = ["top", "first", "three"]

原始 JSON:

{
    "name": "top", 
    "children": [{
        "name": "first",
        "children": [{
            "name": "second",
            "children": [{ "name": "three" }]
        }, {
            "name": "second",
            "children": [{ "name": "three" }]
        }, {
            "name": "second",
            "children": [{ "name": "three" }]
        }]
    }, {
        "name": "first",
        "children": [{
            "name": "second",
            "children": [{ "name": "three" }]
        }, {
            "name": "second",
            "children": [{ "name": "three" }]
        }, {
            "name": "second",
            "children": [{ "name": "three" }]
        }]
    }]
}

新的 JSON:

{
    "name": "top",
    "children": [{
        "name": "first",
        "children": [
            { "name": "three" },
            { "name": "three" },
            { "name": "three" }
        ]
    }, {
        "name": "first",
        "children": [
            { "name": "three" },
            { "name": "three" },
            { "name": "three" }
        ]
    }]
}

我做了什么:

var previous = ""
function loop(a) {
    if (previous.name == a.name) {
        previous = a
        previous['true_children'] = []
    }
    if (accepted.includes(a.name)) {
        previous['true_children'].push(a)
        if (a.children != null) {
            previous = a
            previous['true_children'] = []
        }
    }
    Array.isArray(a.children) && a.children.forEach(loop); 
}

我完成此任务的总体思路是创建一个可以通过 JSON 而不是 children 进行迭代的 true_children 属性。然后,这个新属性只能包含 JSON 中过滤后的级别。

但是,我的代码似乎在第一级将 first 附加到 true_children 一次,并在第二级再次附加一次。是否有解决此问题的方法或更好的方法来实现此目的?

最佳答案

对于JSON字符串,可以在解析过程中进行过滤:

var accepted = ["top", "first", "three"], json = '{"name":"top","children":[{"name":"first","children":[{"name":"second","children":[{"name":"three"}]},{"name":"second","children":[{"name":"three"}]},{"name":"second","children":[{"name":"three"}]}]},{"name":"first","children":[{"name":"second","children":[{"name":"three"}]},{"name":"second","children":[{"name":"three"}]},{"name":"second","children":[{"name":"three"}]}]}]}'

var obj = JSON.parse(json, (k, v) => k == 'name' && !accepted.includes(v) ? void 0 :
                  v.children && v.children.length === 1 && !v.name ? v.children[0] : v)

console.log( obj )

关于javascript - JavaScript 中 JSON 的过滤级别递归保留子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56860023/

相关文章:

javascript - 当我在之前发生的事件中时,如何等待文档在 javascript 中完成加载

javascript - 如何在 C# 中反序列化多个 JSON 对象?

c++ - 递归字符串转换

python - 递归到迭代 - AVL 树 - isBalanced

javascript - Bootstrap 工具提示定位不正确

javascript - 无法使用 javascript 将嵌套 json 转换为平面 json

javascript - 如何从 AngularJS 组件访问 Controller 变量?

jquery - 未捕获的语法错误 : Unexpected token ILLEGAL in chrome

C# JSON 文件到列表

apache - 如何解除内部重定向最大数量限制?