2016-01-08 58 views
0

我希望所有的樹都合併到其父的各個節點,但如果它的子節點包含兩個或兩個以上的子節點,沒有任何變化如何使用遞歸篩選所有單個JSON數據?

這裏是我的數據模型,例如:

[{ 
     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: 這是想法,但是現在有一個問題,找到節點不能回下降到原來的節點,您只能修改cu rrent父節點:

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

向我們展示你嘗試過什麼。 – Cristik

+0

我得知你爲什麼要檢查一個節點是否只有一個孩子,但你爲什麼要檢查這個孩子是否也有孩子?這應該只發生在葉子上嗎?如果你擺脫了「!data [i] .value [0] .value」檢查,我相信你應該最終得到你想要的結構。 – Vinay

回答

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); 
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));
<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>