我有一个用例,其中来自后端的JSON响应如下:
[
{
"name": "cab",
"child": [
{
"name": "def",
"child": [
{
"name": "ghi",
"power": "0.00",
"isParent": false
}
],
"power": "1.23",
"isParent": true
}
],
"power": "1.1",
"isParent": true
},
{
"name": "hhi",
"child": [
{
"name": "hhi2",
"child": [
{
"name": "hhi3",
"power": "0.00",
"isParent": false
}
],
"power": "1.23",
"isParent": true
}
],
"power": "1.1",
"isParent": true
}
]
我需要移除所有具有幂== 0的对象。它很容易在简单的数组集合上使用过滤器,但是可能存在任何 n 数量的子项都可以包含 n 个孩子数量。
提前致谢!
答案 0 :(得分:5)
使用递归函数迭代数组:
var json = ["JSON_HERE"];
function deleteIterator(json) {
if(json.power == "0.00") {
return null;
} else if(json.child) {
json.child = deleteIterator(json.child);
}
return json;
}
for(var i = 0; i < json.length; i++) {
json[i] = deleteIterator(json[i]);
}
这是做什么的:
"0.00"
。
null
)答案 1 :(得分:2)
递归遍历对象,每次寻找孩子并过滤权力=== 0或任何你的要求。
如果您不知道如何使用递归,here is a tutorial可以帮助您入门。我真的希望有人不跟我走过来,把你问题的确切解决方案交给你,因为一旦你知道如何使用递归,你应该能够自己解决这个问题。你也可以使用循环,但..递归是最好的。
编辑:这个问题已经解决before,但风格各异,但都是一样的。如果您发现您的实施最终会出现您无法解决的错误,请随时在新问题中提及我,我会尽力帮助您。
答案 2 :(得分:1)
您可以使用带有命名函数表达式的Array#filter
递归迭代:
var objArray = [{"name":"cab","child":[{"name":"def","child":[{"name":"ghi","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true},{"name":"hhi","child":[{"name":"hhi2","child":[{"name":"hhi3","power":"0.00","isParent":false}],"power":"1.23","isParent":true}],"power":"1.1","isParent":true}];
objArray = _.filter(objArray, function powerFilter(o) {
if (o.power == 0) return false;
if (o.isParent && o.child) {
o.child = _.filter(o.child, powerFilter); // recursive call
o.isParent = o.child.length > 0;
if (!o.isParent) delete o.child;
}
return true;
});
console.log(objArray);
&#13;
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script>
&#13;