在javascript中从数组中删除对象元素

在javascript中从数组中删除对象元素,javascript,recursion,internet-explorer-8,tree,Javascript,Recursion,Internet Explorer 8,Tree,我有一个未确定级别的json树,如下所示: var nodeset = { "name" : "FORM", "attributes" : { "IDFORM" : "59", "NOMDOC" : "1", "VERSFORM" : "1.01", "DATEREPORT" : "10.10.1988" }, "nodes" : [{ "name" : "PART1",

我有一个未确定级别的json树,如下所示:

var nodeset = {
    "name" : "FORM",
    "attributes" : {
        "IDFORM" : "59",
        "NOMDOC" : "1",
        "VERSFORM" : "1.01",
        "DATEREPORT" : "10.10.1988"
    },
    "nodes" : [{
            "name" : "PART1",
            "persist" : true,
            "nodes" : [{
                    "name" : "FTYPE",
                    "persist" : true,
                    "value" : "1",
                    "weight" : 1
                }, {
                    "name" : "STARTDATE",
                    "persist" : true,
                    "value" : "01.10.2011",
                    "weight" : 1
                }, {
                    "name" : "ENDDATE",
                    "persist" : true,
                    "value" : "31.12.2011",
                    "weight" : 1
                }
            ],
            "value" : "31.12.2011",
            "weight" : 3
        }, {
            "name" : "PART2",
            "persist" : true,
            "nodes" : [{
                    "name" : "F203",
                    "persist" : true,
                    "value" : 12,
                    "weight" : 1
                }, {
                    "name" : "F204",
                    "persist" : true,
                    "value" : 12,
                    "weight" : 1
                }, {
                    "name" : "STI059DETAIL",
                    "persist" : false,
                    "nodes" : [{
                            "name" : "F1",
                            "persist" : false,
                            "value" : "asd",
                            "weight" : 1
                        }, {
                            "name" : "F2",
                            "persist" : false,
                            "value" : "asd",
                            "weight" : 1
                        }, {
                            "name" : "F3",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }, {
                            "name" : "F4",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }
                    ],
                    "value" : 0,
                    "weight" : 2
                }, {
                    "name" : "STI059DETAIL",
                    "persist" : false,
                    "nodes" : [{
                            "name" : "F1",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F2",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F3",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }, {
                            "name" : "F4",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }
                    ],
                    "value" : 0,
                    "weight" : 0
                }, {
                    "name" : "STI059DETAIL",
                    "persist" : false,
                    "nodes" : [{
                            "name" : "F1",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F2",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F3",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }, {
                            "name" : "F4",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }
                    ],
                    "value" : 0,
                    "weight" : 0
                }
            ],
            "value" : 0,
            "weight" : 4
        }
    ],
    "weight" : 7
};
function clean(index, owner){
    var node    = owner[index],
        weight  = node.weight;

    delete node.weight;

    if(typeof node.persist != 'undefined'){
        delete node.persist;
    }

    if(!node.nodes)return;

    if(!weight){
        owner.splice(index, 1);
    }

    for(var i = 0; i < node.nodes.length; i++){
        clean(i, node.nodes);
    }
}

for(var i = 0; i < nodeset.nodes.length; i++){
    clean(i, nodeset.nodes);
}
我的任务是删除
weight
0
节点
属性存在的所有节点

由于它是一棵树,我尝试使用如下递归函数:

var nodeset = {
    "name" : "FORM",
    "attributes" : {
        "IDFORM" : "59",
        "NOMDOC" : "1",
        "VERSFORM" : "1.01",
        "DATEREPORT" : "10.10.1988"
    },
    "nodes" : [{
            "name" : "PART1",
            "persist" : true,
            "nodes" : [{
                    "name" : "FTYPE",
                    "persist" : true,
                    "value" : "1",
                    "weight" : 1
                }, {
                    "name" : "STARTDATE",
                    "persist" : true,
                    "value" : "01.10.2011",
                    "weight" : 1
                }, {
                    "name" : "ENDDATE",
                    "persist" : true,
                    "value" : "31.12.2011",
                    "weight" : 1
                }
            ],
            "value" : "31.12.2011",
            "weight" : 3
        }, {
            "name" : "PART2",
            "persist" : true,
            "nodes" : [{
                    "name" : "F203",
                    "persist" : true,
                    "value" : 12,
                    "weight" : 1
                }, {
                    "name" : "F204",
                    "persist" : true,
                    "value" : 12,
                    "weight" : 1
                }, {
                    "name" : "STI059DETAIL",
                    "persist" : false,
                    "nodes" : [{
                            "name" : "F1",
                            "persist" : false,
                            "value" : "asd",
                            "weight" : 1
                        }, {
                            "name" : "F2",
                            "persist" : false,
                            "value" : "asd",
                            "weight" : 1
                        }, {
                            "name" : "F3",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }, {
                            "name" : "F4",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }
                    ],
                    "value" : 0,
                    "weight" : 2
                }, {
                    "name" : "STI059DETAIL",
                    "persist" : false,
                    "nodes" : [{
                            "name" : "F1",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F2",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F3",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }, {
                            "name" : "F4",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }
                    ],
                    "value" : 0,
                    "weight" : 0
                }, {
                    "name" : "STI059DETAIL",
                    "persist" : false,
                    "nodes" : [{
                            "name" : "F1",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F2",
                            "persist" : false,
                            "value" : null,
                            "weight" : 0
                        }, {
                            "name" : "F3",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }, {
                            "name" : "F4",
                            "persist" : false,
                            "value" : 0,
                            "weight" : 0
                        }
                    ],
                    "value" : 0,
                    "weight" : 0
                }
            ],
            "value" : 0,
            "weight" : 4
        }
    ],
    "weight" : 7
};
function clean(index, owner){
    var node    = owner[index],
        weight  = node.weight;

    delete node.weight;

    if(typeof node.persist != 'undefined'){
        delete node.persist;
    }

    if(!node.nodes)return;

    if(!weight){
        owner.splice(index, 1);
    }

    for(var i = 0; i < node.nodes.length; i++){
        clean(i, node.nodes);
    }
}

for(var i = 0; i < nodeset.nodes.length; i++){
    clean(i, nodeset.nodes);
}
功能清理(索引,所有者){
var节点=所有者[索引],
权重=节点权重;
删除节点权重;
if(typeof node.persist!=“未定义”){
删除node.persist;
}
如果(!node.nodes)返回;
如果(!重量){
业主。接头(索引,1);
}
对于(var i=0;i
但是
splice()
不知何故,并没有从那里删除任何内容。我已将其替换为
delete owner[index]
,这会导致这些节点上出现
null
值(我不希望在那里看到
:(

我的问题:为什么
splice()
函数没有按我预期的那样工作(没有删除节点)?另外,我是否采取了正确的方法?如果没有,请提供其他建议

问候

测试fiddle,如果它可能有帮助的话。

您可以使用和筛选出权重为0的节点。首先,定义一个谓词:

var keepNode = function(node) {
    return !(node.weight == 0 && node.hasOwnProperty("nodes"));
};
然后是一个函数,用于清除节点中不需要的子节点,然后在剩余子节点上递归:

function clean(tree) {
    if (tree.nodes) {
         tree.nodes = tree.nodes.filter(keepNode);
         tree.nodes.forEach(clean);
    }
}
最后,处理整个数据结构:

clean(nodeset);
几乎可以肯定,有一种更优雅的方式在过滤时递归,但这应该可以完成这项工作

编辑(因为我没有注意到IE8标签)

对于IE8(不支持
过滤器
),您有两种选择。您可以使用将大多数EcmaScript函数添加到传统JS引擎中的。或者,您也可以使用此垫片(可在上面链接的
过滤器的文档页面上进一步获得):

if(!Array.prototype.filter)
{
Array.prototype.filter=函数(fun/*,thisp*/)
{
“严格使用”;
if(this==null)
抛出新的TypeError();
var t=对象(本);
var len=t.length>>>0;
如果(乐趣的类型!=“功能”)
抛出新的TypeError();
var-res=[];
var thisp=参数[1];
对于(变量i=0;i
您可以使用和筛选出权重为0的节点。首先,定义一个谓词:

var keepNode = function(node) {
    return !(node.weight == 0 && node.hasOwnProperty("nodes"));
};
然后是一个函数,用于清除节点中不需要的子节点,然后在剩余子节点上递归:

function clean(tree) {
    if (tree.nodes) {
         tree.nodes = tree.nodes.filter(keepNode);
         tree.nodes.forEach(clean);
    }
}
最后,处理整个数据结构:

clean(nodeset);
几乎可以肯定,有一种更优雅的方式在过滤时递归,但这应该可以完成这项工作

编辑(因为我没有注意到IE8标签)

对于IE8(不支持
过滤器
),您有两种选择。您可以使用将大多数EcmaScript函数添加到传统JS引擎中的。或者,您也可以使用此垫片(可在上面链接的
过滤器的文档页面上进一步获得):

if(!Array.prototype.filter)
{
Array.prototype.filter=函数(fun/*,thisp*/)
{
“严格使用”;
if(this==null)
抛出新的TypeError();
var t=对象(本);
var len=t.length>>>0;
如果(乐趣的类型!=“功能”)
抛出新的TypeError();
var-res=[];
var thisp=参数[1];
对于(变量i=0;i
当节点权重为0时,在该节点上生根的整个子树需要移动?是的。它需要移动。只允许
具有
权重的节点
=
0
允许。不允许整个子树。当节点权重为0时,在该节点上生根的整个子树需要移动?是的。只需要移动
具有
权重的节点de>=
0
允许。整个子树都不允许。谢谢你的努力。IE8不喜欢
Array.filter
。它在最新的Chrome下仍然可以工作。但是没有解决IE中的问题。@CORRUPT-Oops。没有注意到IE8标签。我编辑了这篇文章。非常感谢。我会自己重新实现它。谢谢你的努力。IE8不喜欢
Array.filter
。它仍然在最新的Chrome下工作。但在IE中无法解决问题。@CORRUPT-Oops。没有注意到IE8标签。我编辑了这篇文章。非常感谢。我将自己重新实现它。