[英]Transform an array of objects into a single object
我正在嘗試將對象數組組合成一個對象,該對象合並所有類似屬性的值。
objArray = [{ foo: ["f", "b"], bar: ["e"] }, { foo: ["a", "c"], bar: ["a", "c"] }, { foo: ["f", "b"], bar: ["z"] }]; const newObj = { foo: [], bar: [] }; objArray.forEach((obj) => { newObj.foo.push(...obj.foo); newObj.bar.push(...obj.bar); }); console.log(newObj);
通過以上代碼,我得到了所需的輸出。 是否像上面那樣使用forEach循環是實現我要設置的最佳方法? 理想情況下,我不想指定要合並的屬性,我希望代碼自動合並相同的屬性名稱。
編輯:
我需要支持IE11
可以使用Object#entries()
的嵌套reduce()來迭代屬性,而無需在任何地方硬編碼特定的屬性名稱
objArray = [{ foo: ["f", "b"], bar: ["e"] }, { foo: ["a", "c"], bar: ["a", "c"] }, { foo: ["f", "b"], bar: ["z"] }]; const res= objArray.reduce((acc,c)=>{ return Object.entries(c).reduce((a,[k,v])=>{ a[k] = (a[k] || []).concat(v) return a },acc) },{}) console.log(res)
您可以獲取對象的條目以獲取任意數量的鍵和值。
var data = [{ foo: ["f", "b"], bar: ["e"] }, { foo: ["a", "c"], bar: ["a", "c"] }, { foo: ["f", "b"], bar: ["z"] }], merged = data.reduce((r, o) => Object.entries(o).reduce((s, [k, v]) => Object.assign(s, { [k]: (s[k] || []).concat(v) }), r), {}); console.log(merged);
.as-console-wrapper { max-height: 100% !important; top: 0; }
為了獲得預期的結果,請使用Object.keys並使用forEach進行兩個循環
objArray = [ { foo: ["f", "b"], bar: ["e"], zoo: ["z"] }, { foo: ["a", "c"], bar: ["a", "c"] }, { foo: ["f", "b"], bar: ["z"] } ]; const newObj = { foo: [], bar: [] }; objArray.forEach(obj => { Object.keys(obj).forEach(v => { if (newObj.hasOwnProperty(v)) { newObj[v].push(obj[v]); } }); }); console.log(newObj);
codepen供參考-https://codepen.io/nagasai/pen/MqOpWm?editors = 1010
像您一樣使用forEach,但for in
內部使用。
var objArray = [{foo: ["f", "b"],bar: ["e"]},{foo: ["a", "c"],bar:["a", "c"]},{foo: ["f", "b"],bar: ["z"]}]; var newObj = {}; objArray.forEach(o => { for (p in o) { if (!(p in newObj)) { newObj[p] = []; } newObj[p] = [...newObj[p], ...o[p]]; } }); console.log(newObj);
采取@charlietfl答案並將其編輯為IE(使用Object.keys
而不是Object.entries
)
objArray = [{ foo: ["f", "b"], bar: ["e"] }, { foo: ["a", "c"], bar: ["a", "c"] }, { foo: ["f", "b"], bar: ["z"] }]; const res = objArray.reduce((acc, c) => { return Object.keys(c).reduce((a, k) => { let v = c[k]; a[k] = (a[k] || []).concat(v); return a; }, acc); }, {}); console.log(res)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.