我希望树中的所有单个节点都合并到其父节点中,但是如果其子节点包含两个或更多子节点,则不做任何更改。
这是我的数据模型示例:
[{
name: "HOME",
value: [{//Only node merged into the parent level
name: "HOME",
value: [{//Only node merged into the parent level
name: "HOME",
id: '1000'
}]
}]
}, {
name: "ARTICLE",
value: [{
name: "ARTICLE",
value: [{
name: "ARTICLE TYPE 1",
id: '2001'
},{
name: "ARTICLE TYPE 2",
id: '2002'
}]
},{
name: "ARTICLE",
value: [{//Only node merged into the parent level
name: "ARTICLE TYPE 3",
id: '2003'
}]
}]
}]
我想像这样过滤数据:
[{
name: "HOME",
id: 1000
}, {
name: "ARTICLE",
value: [{
name: "ARTICLE",
value: [{
name: "ARTICLE TYPE 1",
id: '2001'
},{
name: "ARTICLE TYPE 2",
id: '2002'
}]
},{
name: "ARTICLE TYPE 3",
id: '2003'
}]
}]
//更新1: 这是个想法,但是现在有一个问题,发现节点无法回退到原始节点,只能修改当前的父节点:
function filter(data){
for(var i = 0; i < data.length; i++){
if( !data[i].value ) continue;
//Check whether there are child nodes "value" is because it contains a "value" does not exist "id",
//you must enter a recursive make the following checks
if( data[i].value.length === 1 && !data[i].value[0].value ) {
data[i].id = data[i].value[0].id;
delete data[i].value;
continue;
}
filter( data[i].value );
}
return data;
}
我现在直接修改原始对象,我不知道这样做是否合理。
//更新2: 我的最终措辞是这样的,结果输出看起来是正确的,但是不确定逻辑是否正确,看起来非常难看,或者不知道是否有更好的解决方案?
function filter(data, parent){
for(var i = 0; i < data.length; i++){
if( data[i].value ) filter( data[i].value, data[i] );
if( parent && data.length === 1 && !data[i].value ) {
parent.id = data[i].id;
delete parent.value;
}
}
return data;
}
答案 0 :(得分:1)
一个简单的版本
function merge(node){
if(node.value){
var children = node.value.map(merge);
return children.length === 1?
children[0]:
{
name: node.name,
value: children
};
}
return node;
}
var result = data.map(merge);
左右:
function cp(a, b){
for(var k in b){
if(k === "value" || k in a) continue;
a[k] = b[k];
}
return a;
}
function merge(node){
if(node.value){
var children = node.value.map(merge);
return children.length===1 && !("value" in children[0])?
cp(children[0], node):
cp({ value: children }, node);
}
return cp({}, node);
}
var result = data.map(merge);
答案 1 :(得分:0)
这个版本更容易理解。功能要么
var data = [{
name: "HOME",
value: [{//Only node merged into the parent level
name: "HOME",
value: [{//Only node merged into the parent level
name: "HOME",
id: '1000'
}]
}]
}, {
name: "ARTICLE",
value: [{
name: "ARTICLE",
value: [{
name: "ARTICLE TYPE 1",
id: '2001'
},{
name: "ARTICLE TYPE 2",
id: '2002'
}]
},{
name: "ARTICLE",
value: [{//Only node merged into the parent level
name: "ARTICLE TYPE 3",
id: '2003'
}]
}]
}];
function merge(node) {
if (node.value == undefined) return;
if (node.value.length == 1) {
var child = node.value[0];
node.name = child.name;
if (child.id) node.id = child.id;
if (child.value) node.value = child.value;
else delete node.value;
merge(node);
} else {
node.value.forEach(function(child) {
merge(child);
});
}
}
$('#input').html(JSON.stringify(data));
data.forEach(function(node) { merge(node) });
$('#output').html(JSON.stringify(data));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Input: <div id="input"></div>
Output: <div id="output"></div>
&#13;