2 回答

TA貢獻1843條經驗 獲得超7個贊
您可以使用.reduce()將所有具有相同名稱的對象合并到一個Map. 這可以通過保留name具有該名稱的對象的鍵和值的映射。每當您在數組中遇到新對象時,您都可以檢查它是否存在于地圖中。如果是這樣,您可以添加到likings存儲在關聯對象中的數組中。true如果當前對象為,您還可以將狀態更新為true。如果映射中不存在對象的名稱作為鍵,您可以將對象添加為值,進一步的后續迭代reduce可以合并到該值中。
請參見下面的示例:
const arr = [ { name: 'jane', age: 10, status: true, likings: [{ sports: 'football', books: 'harrypotter' }], }, { name: 'sam', age: 20, status: false, likings: [{ sports: 'basketball', books: 'book1' }], }, { name: 'jane', age: 10, status: false, likings: [{ sports: 'chess', books: 'book2' }], }, { name: 'robert', age: 40, status: false, likings: [{ sports: 'carrom', books: 'book3' }], }, { name: 'jane', age: 10, status: false, likings: [{ sports: 'gaming', books: 'book4' }], }, { name: 'sam', age: 10, status: false, likings: [{ sports: 'gaming', books: 'book5' }], }];
const merged = [...arr.reduce((m, o) => {
const curr = m.get(o.name) || {};
return m.set(o.name, {...o, status: curr.status || o.status, likings: [...(curr && curr.likings || []), ...o.likings]});
}, new Map).values()]
console.log(merged);

TA貢獻1829條經驗 獲得超13個贊
我認為我沒有完全理解您的要求,尤其是關于“相似名稱”的要求。因此,我假設您要根據“名稱”對記錄進行分組,并且所有具有相同“名稱”的記錄都將具有相同的“年齡”。
下面的解決方案是使用一個對象對記錄進行分組,hash并繼續將它們連接likings到元素中。完成后,通過調用返回對象的所有元素,Object.values()應該保持名稱出現的順序。
這是你想要的,或者至少給你一些想法?希望能幫助到你。
function merge(records) {
const hash = {};
for (let i = 0; i < records.length; i++) {
const element = records[i];
const key = element.name; // if you want to do something for "similarity", do something here.
hash[key] = {
...element,
status: (hash[key] && hash[key].status) || element.status,
likings: element.likings.concat((hash[key] && hash[key].likings) || []),
};
}
return Object.values(hash);
}
const data = [
{
name: "jane",
age: 10,
status: true,
likings: [{ sports: "football", books: "harrypotter" }],
},
{
name: "sam",
age: 20,
status: false,
likings: [{ sports: "basketball", books: "book1" }],
},
{
name: "jane",
age: 10,
status: false,
likings: [{ sports: "chess", books: "book2" }],
},
{
name: "robert",
age: 40,
status: false,
likings: [{ sports: "carrom", books: "book3" }],
},
{
name: "jane",
age: 10,
status: false,
likings: [{ sports: "gaming", books: "book4" }],
},
];
console.log(merge(data));
添加回答
舉報