2014-04-13 20 views
0

這是this one一個後續問題,雖然兩者在操作JS:重新組織基於特定鍵的值的數組中的對象(減少?)


的術語無關與開始這種結構:

[ [{ field: "field1", term: "val1"}, 
    { field: "field2", term: "val2"} 
    ], 
    [{ field: "field3", term: "val3"}, 
    { field: "field3", term: "val4"}, 
    { field: "field4", term: "val5"} 
    ], 
    [{ field: "field3", term: "val6"}, 
    { field: "field2", term: "val7"}, 
    { field: "field3", term: "val8"}, 
    { field: "field1", term: "val9"}, 
    { field: "field2", term: "val10"} 
    ] 
] 

我需要通過每個子陣列進行迭代,並且對於每個對象的內部,聚集鍵term的值到一個數組當鍵field是一樣;在同一場合下,爲了簡化,將數字鍵term的所有值包含在數組中。最終結果將是,像這樣:

[ [{ field: "field1", term: ["val1"]}, 
    { field: "field2", term: ["val2"]} 
    ], 
    [{ field: "field3", term: ["val3", "val4"}, 
    { field: "field4", term: ["val5"]} 
    ], 
    [{ field: "field3", term: ["val6", "val8"]}, 
    { field: "field2", term: ["val7", "val10"]}, 
    { field: "field1", term: ["val9"]} 
    ] 
] 

我試着打_.reduce每個對象,得到了比較接近,但從未完全存在。根本不掌握這種模式,我不相信reduce是要走的路要麼

任何想法或指針?一直試圖總結這一個2天...:S

感謝

回答

2

好了,你可以爲每個陣列那種有「場」值作爲密鑰的新對象,而「術語」數組作爲值。然後,您可以將其轉換回原始形式的對象。

var newArray = array.map(function(subArray) { 
    var obj = subArray.reduce(function(m, o) { 
    if (o.field in m) 
     m[o.field].push(o.term); 
    else 
     m[o.field] = [o.term]; 
    return m; 
    }, {}); 

    return Object.keys(obj).map(function(field) { 
    return { field: field, term: obj[field] }; 
    }); 
}); 
+0

非常感謝!與預期完全一致;我必須弄清楚MapReduce發生了什麼;出於某種原因,我永遠不可能把這件事包括在內:/ –

+1

@OlivierClément如果你想看看發生了什麼,它可能有助於'console.log()'中間的「obj」值。 – Pointy

相關問題