2012-12-10 46 views
0

我在當前有很好的_.groupBy方法的項目中使用了underscore.js。在下劃線組合後加入或合併json對象BY

這將我的數組以這種格式分組。

var obj1 ={ 
    '0':[{ ... json object...},{ ... json object...},{ ... json object...}], 
    '1':[{ ... json object...},{ ... json object...},{ ... json object...}], 
    '2':[{ ... json object...},{ ... json object...},{ ... json object...}] 
} 

var obj2 = { 
    '0':[{ ... another json object...},{ ...another json object...}], 
    '1':[{ ... another json object...},{ ...another json object...}], 
    '2':[{ ... another json object...},{ ... another json object...}] 
} 

現在我想加入/合併/擴展它們...但_.extend不工作,我會想到它。

我預期的結果將是

{'0':[{ ... json object...},{ ... json object...},{ ... json object...},{ ... another json object...},{ ...another json object...}], 
'1':[{ ... json object...},{ ... json object...},{ ... json object...},{ ... another json object...},{ ...another json object...}], 
'2':[{ ... json object...},{ ... json object...},{ ... json object...},{ ... another json object...},{ ... another json object...}]} 

基本上我需要延長的基礎上obj1obj2 JSON的關鍵,即使內JSON對象是不同的陣列。

基本上會需要像SQL聯接的JSON對象操作...

因此,任何幫助將是巨大的......

+1

那些不是JSON對象。他們只是對象。 :-) JSON是一種文本數據表示法(它是您在那裏使用的是JavaScript對象初始化器語法的子集)。 (這些例子是完全有效的對象初始化器,但不會是有效的JSON,它需要鍵和字符串用雙引號,而不是單引號。)對不起,不能幫助解決實際問題,我不知道underscore.js,所以我不知道它是否有什麼可以幫助你。JavaScript本身並不是,你只需循環,並自己添加數組。 –

+0

好的。謝謝你的提升。這是從下劃線組合出來的......這是否影響_.extend方法的任何內容。或者你是否提到了措辭的正確性。感謝您的答覆=) – silverfighter

+0

@ silverfighter:只是爲了糾正術語,因爲有時它很重要。對不起,沒有任何與underscore.js的幫助,我不知道它。 (如果您沒有看到,我在上面的評論中加了一點。)最好, –

回答

3

好了,因爲沒有具體的underscore.js,答案已經出現,這裏的一般的JavaScript之一:

要合併成obj2obj1,通過循環obj2的條目,並附加上obj1那些陣列的等效陣列,這樣的:

var key, a1, a2; 
for (key in obj2) { 
    if (obj2.hasOwnProperty(key)) { 
    a2 = obj2[key]; 
    a1 = obj1[key]; 
    if (a1) { 
     a1.push.apply(a1, a2); // Tricky, see below 
    } 
    else { 
     obj1[key] = a2; 
    } 
    } 
} 

這合併obj2obj1,修改obj1的陣列就位。如果obj1在相應的插槽中沒有一個,它將重用obj2的陣列。

Live Example | Source

有關 「刁鑽」 位:

a1.push.apply(a1, a2); 

什麼,做是追加a2的元素的a1結束。 Details on my blog,但基本上,Array#push添加元素的數組的末尾,多達你指定的參數(如a.push(1, 2, 3)123到陣列),以及Function#apply調用函數指定爲this使用什麼(第一個參數)以及傳遞給它的參數,作爲一個數組(第二個參數)。

1

我需要做類似的事情。加入兩個對象,但確保兩個groupby字段具有相同的名稱,san。我需要從some_scores附加score。需要_.each來創建外部連接。地圖創建您需要的名稱/值的最終對象:

var x = _.chain(moves) 
      .union(some_scores)  
      .groupBy('san') 
      .each(function(o){ o.push({score:''}); }) 
      .map(function(o){return {san:o[0].san, to:o[0].to, score:o[1].score }; }) 
      .value(); 
+0

請格式化您的代碼 –