删除所有 power == 0 的数组
Remove all arrays that has power == 0
我有一个用例,其中有来自后端的 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 的 objects。在简单的数组集合上使用过滤器很容易,但可能存在任何 n number of childs 可以包含 n 个孩子。
提前致谢!
递归遍历对象,每次都查找子对象并根据 power === 0 或任何您的要求进行过滤。
如果您不知道如何使用递归,here is a tutorial 可以帮助您入门。我真的希望不要有人跟着我走,把你问题的确切解决方案交给你,因为一旦你知道如何使用递归,你就应该能够自己解决这个问题。您也可以使用循环,但是..递归是最好的。
编辑:这个问题已经解决了 before,方式不同,但都是一样的。如果您发现您的实现最终出现无法解决的错误,请随时在新问题中提及我,我会尽力帮助您。
只需使用递归函数遍历数组即可:
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]);
}
它的作用是:
- 遍历 JSON children.
- 查看电量是否为
"0.00"
。
- 如果是,请将其删除 (return
null
)
- 检查是否有children
- 如果是,则对其进行迭代(转到第 2 步)
- Return JSON 元素。
您可以使用 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);
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script>
我有一个用例,其中有来自后端的 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 的 objects。在简单的数组集合上使用过滤器很容易,但可能存在任何 n number of childs 可以包含 n 个孩子。
提前致谢!
递归遍历对象,每次都查找子对象并根据 power === 0 或任何您的要求进行过滤。
如果您不知道如何使用递归,here is a tutorial 可以帮助您入门。我真的希望不要有人跟着我走,把你问题的确切解决方案交给你,因为一旦你知道如何使用递归,你就应该能够自己解决这个问题。您也可以使用循环,但是..递归是最好的。
编辑:这个问题已经解决了 before,方式不同,但都是一样的。如果您发现您的实现最终出现无法解决的错误,请随时在新问题中提及我,我会尽力帮助您。
只需使用递归函数遍历数组即可:
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]);
}
它的作用是:
- 遍历 JSON children.
- 查看电量是否为
"0.00"
。- 如果是,请将其删除 (return
null
)
- 如果是,请将其删除 (return
- 检查是否有children
- 如果是,则对其进行迭代(转到第 2 步)
- Return JSON 元素。
您可以使用 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);
<script src="https://cdn.jsdelivr.net/underscorejs/1.8.3/underscore-min.js"></script>