簡體   English   中英

如何組合鍵值相同的多個JSON對象

[英]How to combine multiple JSON objects where key value is the same

我正在嘗試組合共享相同模塊鍵值的對象,即“信用卡”。 我需要為每個獨特模塊返回一個對象,其中包含一系列不同的公司。 id和prod鍵並不重要。

這是我需要轉換的對象:

const data = [
   {module: "credit_cards", id: "1", company: "ABC", prod: "1"}, 
   {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, 
   {module: "credit_cards", id: "3", company: "EFG", prod: "2"}, 
   {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, 
   {module: "mortgages", id: "4", company: "EFG", prod: "3"}
]

我需要返回這樣的東西:

const result = [
{module: "credit_cards", company: ["ABC", "XYZ", "EFG"]}, 
{module: "mortgages", company: ["EFG"]}
]

到目前為止,我已經嘗試過這個功能:

const result = data.reduce(function(r, e) {
  return Object.keys(e).forEach(function(k) {
    if(!r[k]) r[k] = [].concat(e[k])
    else r[k] = r[k].concat(e[k])
  }), r
}, {})

但它只是將所有關鍵/值連接在一起......

任何幫助都會很棒,謝謝:)

您可以使用reduce將數組匯總到Map 使用Set唯一值。

 const data = [{"module":"credit_cards","id":"1","comapany":"ABC","prod":"1"},{"module":"credit_cards","id":"2","comapany":"XYZ","prod":"2"},{"module":"credit_cards","id":"3","comapany":"EFG","prod":"2"},{"module":"credit_cards","id":"2","comapany":"XYZ","prod":"2"},{"module":"mortgages","id":"4","comapany":"EFG","prod":"3"}] const result = Array.from(data.reduce((c, {module,comapany}) => { if (!c.has(module)) c.set(module, new Set); c.get(module).add(comapany); return c; }, new Map)).map(([module, comapany]) => ({module,comapany: [...comapany]})); console.log(result); 

縮小為由module索引的對象,然后獲取該對象的值。 因為您只需要唯一的company值,所以最初使用Set,然后將所有項目的company集轉換回數組:

 const data = [ {module: "credit_cards", id: "1", company: "ABC", prod: "1"}, {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, {module: "credit_cards", id: "3", company: "EFG", prod: "2"}, {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, {module: "mortgages", id: "4", company: "EFG", prod: "3"} ] const result = Object.values(data.reduce( (a, { module, company }) => { if (!a[module]) a[module] = { module, company: new Set() }; a[module].company.add(company); return a; }, {} )); result.forEach((item) => { item.company = [...item.company]; }); console.log(result); 

您可以使用第一個Array.reduce()Set上的module鍵對companies進行分組。 上的第二個步驟可以使用array.Map()對生成的對象.entries()以獲得最終所需的結果:

 const data = [ {module: "credit_cards", id: "1", company: "ABC", prod: "1"}, {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, {module: "credit_cards", id: "3", company: "EFG", prod: "2"}, {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, {module: "mortgages", id: "4", company: "EFG", prod: "3"} ]; let res = data.reduce((acc, {module, company}) => { acc[module] = acc[module] || new Set(); acc[module].add(company); return acc; }, {}) res = Object.entries(res).map( ([module, companies]) => ({module, company: [...companies]}) ); console.log(res); 
 .as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;} 

這是使用Array.reduce和內部檢查的另一種方法,以確保公司列表是唯一的,沒有重復。

 const data = [ {module: "credit_cards", id: "1", company: "ABC", prod: "1"}, {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, {module: "credit_cards", id: "3", company: "EFG", prod: "2"}, {module: "credit_cards", id: "2", company: "XYZ", prod: "2"}, {module: "mortgages", id: "4", company: "EFG", prod: "3"} ] let result = data.reduce((r,{module, company}) => { r[module] = r[module] || { module, company: [] } if(!r[module].company.includes(company)) r[module].company.push(company) return r }, {}) console.log(Object.values(result)) 

   const data = [
  {module: 'credit_cards', id: '1', company: 'ABC', prod: '1'},
  {module: 'credit_cards', id: '2', company: 'XYZ', prod: '2'},
  {module: 'credit_cards', id: '3', company: 'EFG', prod: '2'},
  {module: 'credit_cards', id: '2', company: 'XYZ', prod: '2'},
  {module: 'mortgages', id: '4', company: 'EFG', prod: '3'}
  ];



 const result = data.reduce((array, item) => {
     const id = array.findIndex(el => el.module === item.module);
     if (id > -1) {
       array[id] = {...array[id], company : [...array[id].company, item.company]};
       return array;
     }
     return [...array, {...item, company : [ item.company]}];
    }, []);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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