以下是用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
}