2017-03-16 111 views
0

我是軟件領域的新手。我有一個json陣列的對象像將一種形式的JSON數組轉換爲另一種形式?

var treeObj = [ 
     { 
     "name": "sriram", 
     "refernce_id": "SAN001", 
     "sponer_id": "SAN000" 
     }, 
     { 
     "name": "neeraja", 
     "refernce_id": "SAN002", 
     "sponer_id": "SAN001" 
     }, 
     { 
     "name": "upender", 
     "refernce_id": "SAN003", 
     "sponer_id": "SAN001" 
     }, 
     { 
     "name": "manoj", 
     "refernce_id": "SAN004", 
     "sponer_id": "SAN002" 
     }, 
     { 
     "name": "shirisha", 
     "refernce_id": "SAN005", 
     "sponer_id": "SAN002" 
     }, 
     { 
     "name": "ragu", 
     "refernce_id": "SAN006", 
     "sponer_id": "SAN003" 
     }, 
     { 
     "name": "santhu", 
     "refernce_id": "SAN007", 
     "sponer_id": "SAN003" 
     } 
    ]; 

在這裏,我將通過上述對象的函數。在那個函數中,我需要在每個對象中將引用ID與sponer_id進行比較,如果它們相等,我們需要將它們推入一個數組,我們將其稱爲子對象,就像下面一樣,我們需要再次檢查子數組中的引用ID in存在於上述對象的sponer_id中,如果它再次存在,我們需要將它們推送到子數組中,將其放入包含reference_id的對象中。最終的數組對象看起來像。

[ 
    { 
    "name": "sriram", 
    "parent": null, 
    "children": [ 
     { 
     "name": "neeraja", 
     "parent": "sriram", 
     "children": [ 
      { 
      "name": "manoj", 
      "parent": "neeraja" 
      }, 
      { 
      "name": "shirisha", 
      "parent": "neeraja" 
      } 
     ] 
     }, 
     { 
     "name": "upender", 
     "parent": "sriram", 
     "children": [ 
      { 
      "name": "ragu", 
      "parent": "neeraja" 
      }, 
      { 
      "name": "santhu", 
      "parent": "neeraja" 
      } 
     ] 
     } 
    ] 
    } 
] 

這裏sriram的treeObj參考ID在neeraja和upender對象中作爲sponder id存在。所以neeraja和upender成爲孩子對斯里蘭卡。 neeraja的reference_id在treeObj的manoj和shirisha對象中作爲sponer_id存在。同時孩子可以有更多的孩子對象,我們需要動態地格式化對象。

這是我寫的模樣

var mainArr = [], subArrs = [], subObj={}, subIds = [], find = "SAN001"; 
    formatData(treeObj); 
    function formatData(treeObj){debugger; 
     var arr = []; 
     for(var x=0; x<= treeObj.length-1; x++){debugger; 
      var sampData = treeObj[x]; 
      if(find == sampData.sponer_id){ 
       arr.push(sampData.refernce_id); 
       subArrs.push(sampData); 
      } 
     } 
     subIds.push(arr); 
     console.log(subIds); 
     console.log(subArrs); 
     formatData(subArrs); 
    } 

功能請指導我在哪裏出了錯。提前致謝。

+1

'Java'不是'JavaScript' – Smit

回答

0
//1. find all items the have no parent and push them on a stack like so: 

let stack = treeObj.reduce((list, item) => { 
    if (<ids match>) list.push(item); 
    return item; 
}, []), 

let result = [].concat(stack); 

//2. while loop the stack: 

while (stack.length > 0) { 
    let item = stack.shift(); 

    item.children = treeObj.reduce((list, child) => { 
    if (<ids match>) { 
     list.push(child); 
    } 
    return list; 
    }, []).map(child => { 
     child.parent = item; 
     stack.unshift(item); 
     return child; 
    }); 
} 

return result; 

UPDATE

所以在»好老JS«與一些改進:

var stack = treeObj.filter(function (item) { 
    return item.<parent_id> === item.<child_id> }); 

var result = [].concat(stack); 

while (stack.length > 0) { 
    var item = stack.shift(); 

    item.children = treeObj.filter(function (child) { 
    return item.<id> === child.<parent_id>; 
    }); 

    item.children.forEach(function (child) { stack.unshift(child) }); 
} 

基本上是:

  1. 找到根(S)和保存在堆棧上
  2. while.length > 0

    1. shift()從堆棧中的第一項
    2. 找到堆棧
  3. 完成

添加parent屬性關於該項目的所有兒童和unshift他們項目或刪除不需要的項目可以在循環中完成。整個事情也可以通過遞歸來完成,但是我曾經通過做這樣的事情來執行「太多的遞歸錯誤」,所以我更喜歡迭代方法。當然,您可以使用常規循環,而不是.reduce.filter.forEach,但我更喜歡功能樣式。總而言之,不管你怎麼做,都沒有那麼困難,只要先找到要素,然後再與所有的孩子一起重複等等。利用while循環找到所有的孩子,或者以該元素作爲根的整個子樹。

祝你好運!

+0

感謝您的回覆,philip。但我得到的錯誤爲 未捕獲SyntaxError:讓不允許作爲詞彙綁定名稱 –

+0

這是ES6,JS的新版本。 – philipp

+0

非常感謝你philip ... :)你的邏輯像魅力一樣工作。 –

0

你基本上試圖將數組轉換爲n元樹。

將您的原始樹函數輸入到formatData中,將爲您提供一個數組(arr),其中所有具有SAN001作爲父項的對象的referenceID和具有所有具有sponserId SAN001的子項的另一個數組(子Arrs)。

然後,您將arr存儲在subIds,log subIds和subArr中,並繼續遞歸調用subArrs上的格式數據。然後檢查subArr哪些對象具有「SAN001作爲前驅」(應該是當時的所有對象)並將該對象推入到subArr中。如果我沒有弄錯,這會導致無限循環。

改進起點: 你是「發現」變量不會改變,它是硬連線到「SAN001」 - 這可能是你的第一次旅行可以,當你100%確定根對象總是這個referenceID。但在第二次旅行中,您想要檢查哪些對象依賴於第二級元素,因此您需要將find設置爲對應的referenceId。

您的subArrs包含取決於SAN001的所有對象。但在第二次和隨後的行程中,您不想讓SAN001的孩子,而是孩子在subArr中的對象。因此,您需要遍歷舊對象,找到subArr中的對象的子對象,而不是遍歷正在尋找SAN001的子對象的子對象。

希望清楚一點點。

暗示進一步的研究:你基本上試圖用JavaScript來「將數組轉換爲n元樹」。