簡體   English   中英

將對象數組轉換為單個對象

[英]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進行兩個循環

  1. 使用forEach的第一個循環將處理每個對象
  2. 使用Object.keys的第二個循環將處理每個對象鍵,並使用鍵將其推送到新的Array
  3. 使用Object.hasOwnProperty來為具有原始數組對象屬性的newObj鍵值

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM