2016-01-29 38 views
0

我有一個json數組..我想重構json對象..但我無法按預期輸出。我想搜索所有項目或對象並插入父項的子項..我試試那樣如何計算javascript中的對象中的孩子?

https://jsfiddle.net/nk6v0y36/1/

var new_Arry = []; 
for (var i = 0; i < arry.length; i++) { 
    var obj = {}; 
    var childeren = []; 
    obj.con_id = arry[i].con_id; 
    obj.children = [{ 
     con_to: arry[i].con_to 
    }]; 
    new_Arry.push(obj) 
} 

console.log(new_Arry) 

預期輸出:

[{ 
    "con_id": 11, 
    "children": [{ 
     "con_to": 12 
    }] 
}, { 
    "con_id": 12, 
    "children": [{ 
     "con_to": 13 
    }, { 
     "con_to": 14 
    }] 
}, { 
    "con_id": 13, 
    "children": [] 
}, { 
    "con_id": 14, 
    "children": [{ 
     "con_to": 15 
    }] 
}, { 
    "con_id": 15, 
    "children": [{ 
     "con_to": 16 
    }] 
}, { 
    "con_id": 16, 
    "children": [] 
}] 

答案後

https://jsfiddle.net/nk6v0y36/7/

答不工作..

+1

你不是檢查ID是否已經存在 – thatOneGuy

回答

1

正如thisOneGuy說,你是不是檢查,如果一個CON_ID新的數組中已經存在,所以對於舊陣列中的每個元素你正在創建一個相應的新的。但是,您的預期輸出顯示您想要將這些多個con_id值合併到單個對象中。

即使沒有這樣的屬性,您也會在子數組中創建具有con_to屬性的對象,而這種屬性又是您期望的輸出建議您不會的方式。解決這個問題將是

一種方式:

var new_Arry = []; 
var new_Hash = []; 
for (var i = 0; i < arry.length; i++) { 
    if (new_Hash[arry[i].con_id] === undefined) { 
     var obj = { 
      con_id: arry[i].con_id, 
      children: [] 
     }; 
     if(arry[i].con_to !== undefined) { 
      obj.children.push({ con_to: arry[i].con_to }); 
     } 
     new_Hash[obj.con_id] = new_Arry.push(obj) - 1; 
    } else if(arry[i].con_to !== undefined) { 
     new_Arry[new_Hash[arry[i].con_id]].children.push({ con_to: arry[i].con_to }); 
    } 
} 

console.log(new_Arry); 

這裏的關鍵是new_Hash陣列,它使用CON_ID值作爲它的鍵,並存儲在new_Arry各個索引作爲其值。

因此,對於arry中的每個con_id,它首先檢查new_Hash以查看是否有條目。如果沒有,那麼new_Arry中沒有條目,所以它會創建一個新條目。

首先創建具有con_id和一個子數組的基本對象。然後它會檢查arry中是否存在con_to屬性,並且只有存在時纔會將其作爲對象添加到子數組中。

然後將此對象添加到new_Arry並更新new_Hash,以便con_id的元素引用新的new_Arry索引。由於.push()方法的返回值擴展了一個數組並返回新的數組長度,所以新索引將始終爲該值減1。

但是,如果在new_Hash中找到con_id條目,那麼您只需要將con_to值添加到現有的children數組中。雖然大概如果arry中有多個con_id條目,它們必須包含一個con_to值,它也會檢查這只是安全的。由new_Hash[arry[i].cond_id]返回的new_Arry的索引號。

順便說一句,顯式檢查undefined而不是查看值是否等於true或false以檢查其存在的原因是con_id或con_to值爲0將被視爲false並被忽略。

+0

請分享小提琴..它不工作 – user5711656

+0

請檢查https://jsfiddle.net/nk6v0y36/7/不工作 – user5711656

+0

對不起,有幾種類型使用cond_id而不是con_id,並且第一個if語句是一個if,但應該是if。我已經更新了答案中的代碼,在這裏它是一個小提琴https://jsfiddle.net/Lq5u99c7/ – Michael

0

這樣的 -

var new_Arry = []; 

for (var i = 0; i < arry.length; i++) {  
    var obj = {}; 
    var childeren = []; 
    obj.con_id = arry[i].con_id; 
    var child = []; 
    var childrenObj = {}; 
    childrenObj.con_to = arry[i].con_to; 
    child.push(childrenObj); 
    obj.children = child; 
    new_Arry.push(obj) 
} 

https://jsfiddle.net/nk6v0y36/3/

0

這裏是正確的答案與正確的輸出:https://jsfiddle.net/nk6v0y36/4/

基本上你通過需要循環你的數組檢查con_id是否存在於該數組中,如果存在,只需添加到子項,如果它不添加新對象。

var new_Arry = []; 

for (var i = 0; i < arry.length; i++) { 
    var obj = {}; 
    var childeren = []; 
    if (new_Arry.length > 0) { 
    console.log('start') 
    console.log(new_Arry.length); 

    var thisBool = false; 
    for (var j = 0; j <= new_Arry.length; j++) { 
     console.log('inside') 
     if (new_Arry[j]) { 
     if (new_Arry[j].con_id === arry[i].con_id) { 
      console.log('has children') 
      new_Arry[j].children[new_Arry[j].children.length] = { 
      con_to: arry[i].con_to 
      } 
     } else { 
     thisBool = true; 
     } 
     } 
    } 
    if(thisBool){ 
    obj.con_id = arry[i].con_id; 
    obj.children = [{ 
     con_to: arry[i].con_to 
    }]; 
    new_Arry.push(obj) 
    } 
    } else { 
    console.log('no children') 
    obj.con_id = arry[i].con_id; 
    obj.children = [{ 
     con_to: arry[i].con_to 
    }]; 
    new_Arry.push(obj) 
    } 
} 

檢查控制檯日誌輸出,看看它是正確的:)

相關問題