2014-10-07 102 views
2

我有以下JSON對象。我需要刪除重複項,並使用純Javascript來合併內部對象。我如何去做這件事?刪除重複項併合並JSON對象

[{ 
    "id" : 1, 
    "name" : "abc", 
    "nodes" :[ 
     { 
      "nodeId" : 20, 
      "nodeName" : "test1" 
     } 
    ] 
}, 
{ 
    "id" : 1, 
    "name" : "abc", 
    "nodes" :[ 
     { 
      "nodeId" : 21, 
      "nodeName" : "test2" 
     } 
    ] 
}] 

以下是我期望作爲輸出的對象。

[{ 
    "id" : 1, 
    "name" : "abc", 
    "nodes" :[ 
     { 
      "nodeId" : 20, 
      "nodeName" : "test1" 
     }, 
     { 
      "nodeId" : 21, 
      "nodeName" : "test2" 
     }, 
    ] 
}] 

問候。

Shreerang

+0

也許你可以在你的陣列上使用一個循環,在另一家商店已經完成的項目通過ID檢查後,如果該項目是不是已經在。 然後做一個合併功能或者google一下。 – Loenix 2014-10-07 10:34:01

+1

那麼,你會用{id:1,name:「def」這樣的條目來做什麼...這是一場比賽還是不是? – 2014-10-07 10:38:05

+0

你問的太多了。給你的代碼試試plz – 2014-10-07 10:39:04

回答

2

首先打開JSON成一個Javascript數組,這樣就可以輕鬆地訪問它:

var arr = JSON.parse(json); 

然後通過項目做出的結果和循環數組和比較反對的項目,你把結果:

var result = []; 

for (var i = 0; i < arr.length; i++) { 
    var found = false; 
    for (var j = 0; j < result.length; j++) { 
    if (result[j].id == arr[i].id && result[j].name == arr[i].name) { 
     found = true; 
     result[j].nodes = result[j].nodes.concat(arr[i].nodes); 
     break; 
    } 
    } 
    if (!found) { 
    result.push(arr[i]); 
    } 
} 

然後,你可以創建數組JSON,如果這是最終的結果,你需要:

json = JSON.stringify(result); 
+0

使用'Array.prototype.filter'可以簡化整個循環。特別是因爲你的例子已經使用'concat'。 – Sukima 2014-10-07 10:57:35

+0

@Sukima:是的,它可以,但'filter'不像'concat'那麼多的瀏覽器都支持。例如IE 5.5支持'concat',但你需要IE 9或更高版本才能獲得對'filter'的支持。 – Guffa 2014-10-07 11:11:21

+0

你還支持IE 5?!?!!!!哦,上帝,你有我的哀悼。另外我注意到這種趨勢繼續教育事物的「舊」方式,而不是接受更新的事物。還有聚合填充,他們值得學習。以身作則。 – Sukima 2014-10-07 11:41:38

0

如果字符串被稱爲輸入,則此:

var inter = {}; 
for (var i in input) { 
    if (!inter.hasOwnProperty(input[i].name)) { 
     inter[input[i].name] = input[i].nodes; 
     inter[input[i].name].name = input[i].name; 
     inter[input[i].name].id = input[i].id; 
    } 
    else 
     inter[input[i].name] = inter[input[i].name].concat(input[i].nodes) 
} 

結果: { 「ABC」:[{ 「節點ID」:20, 「節點名稱」: 「測試1」},{ 「節點ID」:21,「節點名稱」:「TEST2」}]}

你可以看到我是如何使用任何匹配標準是鍵入一箇中間對象。按照你的要求,它是一個對象而不是數組,但是你可以反覆使用它。事實上,你可能比這個結構更適合你所要求的數組。

BTW,我猛的一對夫婦的文字命名屬性:「ID」和「名稱」到一個數組那裏。他們不在JSON.stringify中顯示,但他們在那裏。