我正在尝试在所有级别上过滤 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/