次のようなレベルが決定されていない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
};
私の仕事は、プロパティが存在する場所weight
と0
場所からすべてのノードを削除することです。nodes
ツリーなので、次のような再帰関数を使用しようとしました。
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);
}
しかし、splice()
どういうわけか、そこから何も削除しません。私はそれを に置き換えましたdelete owner[index]
。これによりnull
、それらのノードの場所に値が発生します (そこには表示したくありません:(
)。
私の質問:splice()
関数が期待どおりに機能しない (ノードを削除しない)のはなぜですか? また、私は正しいアプローチを取っていますか?いいえの場合は、他の提案をいただければ幸いです。
よろしく。
何らかの形で役立つ場合は、ここでフィドルをテストしてください。