天天看點

js将數組對象中某個值相同的對象合并成一個新對象

作者:NativeBase

以下是用JavaScript實作将數組對象中某個值相同的對象合并成一個新對象的代碼:

function mergeObjectsByValue(arr, key) {
  // 建立一個空對象用于存儲合并後的對象
  const mergedObj = {};
  
  // 周遊數組對象
  arr.forEach(obj => {
    // 擷取目前對象的key值
    const value = obj[key];
    
    // 如果合并後的對象中還沒有以該key值為屬性的對象,則建立一個新對象
    if (!mergedObj[value]) {
      mergedObj[value] = {};
    }
    
    // 合并目前對象到對應的key值對象中
    Object.assign(mergedObj[value], obj);
  });
  
  // 傳回合并後的對象數組
  return Object.values(mergedObj);
}

// 測試代碼
const arr = [
  { id: 1, name: 'Alice', age: 25 },
  { id: 2, name: 'Bob', age: 30 },
  { id: 3, name: 'Alice', gender: 'female' },
  { id: 4, name: 'Charlie', age: 40 }
];

const merged = mergeObjectsByValue(arr, 'name');
console.log(merged);
           

上述代碼中,mergeObjectsByValue函數接收一個數組對象 arr 和一個指定的屬性名 key。它首先建立一個空對象 mergedObj 用于存儲合并後的對象。 然後周遊數組對象,對于每個對象,擷取指定屬性的值 value。 如果合并後的對象中還沒有以 value 為屬性的對象,則建立一個新對象。 最後,使用 Object.assign 将目前對象合并到對應的 value 對象中。 最後,使用 Object.values 傳回合并後的對象數組。

在測試代碼中,我們建立了一個包含不同屬性的數組對象 arr,并調用 mergeObjectsByValue 函數将 name 相同的對象合并成一個新對象數組。最後,将結果列印到控制台上。

方法二(比較适用的一種)

前置資料

var beforeData= [
    { name: "tony", id: "1", age: "20" },
    { name: "jack", id: "2", age: "21" },
    { name: "tony", id: "3", age: "50" },
    { name: "jack", id: "4", age: "10" },
    { name: "mark", id: "5", age: "22" },
    { name: "mark", id: "6", age: "40" }
];           

目标資料結構

afterData= [
    {name: "tony",origin: [{ name: "tony", id: "1", age: "20" },{ name: "tony", id: "3", age: "50" }]},
    {name: "jack",origin: [{ name: "jack", id: "2", age: "21" },{ name: "jack", id: "4", age: "10" }]},
    {name: "mark",origin: [{ name: "mark", id: "5", age: "22" },{ name: "mark", id: "6", age: "40" }]}
]           

方法:

var afterData = []
  beforeData.forEach(item => {
    let flag = afterData.find(item1 => item1.name === item.name)
    if (!flag) {
      afterData.push({
        name: item.name,
        origin: [item]
      })
    } else {
      flag.origin.push(item)
    }
  })
  console.log(afterData)           

此方法可以進一步進行封裝成為通用的

function groupBy (objectArray, key){
	  var afterData = []
    beforeData.forEach(item => {
      let flag = afterData.find(item1 => item1[key] === item[key])
      if (!flag) {
        afterData.push({
          ...item,
          ...{
          	origin: [item]
          }
        })
      } else {
        flag.origin.push(item)
      }
    })
  return afterData
} 
           
js将數組對象中某個值相同的對象合并成一個新對象