删除所有具有幂== 0的数组

时间:2016-08-26 01:18:32

标签: javascript jquery underscore.js

我有一个用例,其中来自后端的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 个孩子数量。

提前致谢!

3 个答案:

答案 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]);
}

这是做什么的:

  1. 迭代JSON孩子。
  2. 检查电源是否为"0.00"
    • 如果是,请将其删除(返回null
  3. 检查是否有孩子
    • 如果是,则迭代它(转到步骤2)
  4. 返回JSON元素。

答案 1 :(得分:2)

递归遍历对象,每次寻找孩子并过滤权力=== 0或任何你的要求。

如果您不知道如何使用递归,here is a tutorial可以帮助您入门。我真的希望有人不跟我走过来,把你问题的确切解决方案交给你,因为一旦你知道如何使用递归,你应该能够自己解决这个问题。你也可以使用循环,但..递归是最好的。

编辑:这个问题已经解决before,但风格各异,但都是一样的。如果您发现您的实施最终会出现您无法解决的错误,请随时在新问题中提及我,我会尽力帮助您。

答案 2 :(得分:1)

您可以使用带有命名函数表达式的Array#filter递归迭代:

&#13;
&#13;
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;
&#13;
&#13;