从JSON对象中删除元素

46

我有一个JSON数组,看起来像这样:

  {
    "id": 1,
    "children": [
    {
        "id": 2,
        "children": {
            "id": 3,
            "children": {
                "id": 4,
                "children": ""
            }
        }
    },
    {
        "id": 2,
        "children": {
            "id": 3,
            "children": {
                "id": 4,
                "children": ""
            }
        }
    },
    {
        "id": 2,
        "children": {
            "id": 3,
            "children": {
                "id": 4,
                "children": ""
            }
        }
    },
    {
        "id": 2,
        "children": {
            "id": 3,
            "children": {
                "id": 4,
                "children": ""
            }
        }
    },
    {
        "id": 2,
        "children": {
            "id": 3,
            "children": {
                "id": 4,
                "children": ""
            }
        }
    },
    {
        "id": 2,
        "children": {
            "id": 3,
            "children": {
                "id": 4,
                "children": ""
            }
        }
    },
    {
        "id": 2,
        "children": {
            "id": 3,
            "children": {
                "id": 4,
                "children": ""
            }
        }
    }]
}

我希望有一个函数,可以移除那些“children”为空的元素。我该如何做?我不是在寻求答案,只是想要一些建议。


小心:那些“=”符号暗示着无效的JSON。 - rjz
2
@magritte 别再问这个多余的问题了。他说他是在寻求建议,而不是答案。 - Royi Namir
@rjz,是的,那些等号应该改成冒号... - Stack Overfolow
我知道那不是一个有效的 JSON……我只是想举个例子来展示它的样子。 - Stack Overfolow
1
如果你说你有一个数组,请发布一个数组。并查看 filter 数组函数 - Bergi
显示剩余2条评论
2个回答

71

要遍历对象的键,请使用 for..in 循环:

for (var key in json_obj) {
    if (json_obj.hasOwnProperty(key)) {
        // do something with `key'
    }
}

为了测试所有元素是否有空子元素,您可以使用递归方法:遍历所有元素并递归地测试它们的子元素。

删除对象的属性可以使用delete关键字:

var someObj = {
    "one": 123,
    "two": 345
};
var key = "one";
delete someObj[key];
console.log(someObj); // prints { "two": 345 }

文档:


11
我已经使用JavaScript编程多年,甚至不知道 delete 这个运算符的存在?! - Emissary
3
我认为他应该使用splice()方法而不是delete,因为子元素是存储在数组中的? - magritte
@magritte 他已经听取了数组和对象。我正在等待一些澄清,但是如果有数组,他可以使用splice来删除元素或使用filter来迭代和删除内容。 - Lekensteyn
3
+1 这是一个可以澄清的地方,即使用 delete 操作符不能从数组中删除元素,而是将其替换为 undefined。delete 只能用于从对象中删除属性。 - Royi Namir

2

JSfiddle

function deleteEmpty(obj){
        for(var k in obj)
         if(k == "children"){
             if(obj[k]){
                     deleteEmpty(obj[k]);
             }else{
                   delete obj.children;
              } 
         }
    }

for(var i=0; i< a.children.length; i++){
 deleteEmpty(a.children[i])
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接