问题描述
我正在努力实现以下目标: 假设您有一个对象数组,如下所示:
[{familyName: "Winston",data: [{},{}]},{familyName: "Winston",{familyName: "Levi",{}]}]
我想要实现的是将每个姓氏分组到一个新对象中,该对象将包含相同姓氏的所有数据。例如:
[ { familyName: "Winston",data:[{},{},{}] },{ familyName: "Levi",{}] } //new array will contain the combined data objects
因此,最后,我将拥有一个数组,其中每个唯一属性都有一个对象 + 该特定属性的所有数据对象的总和。 我设法通过创建一个“模板数组”然后按如下方式推送它来实现这一点:
for (let name of array) {
for (let property of templateArray) {
if (name.familyName === property.familyName) {
property.data.push(name)
}
}
}
我希望找到一个更优雅、更高效的解决方案,甚至可能不需要事先创建模板数组。有没有? 谢谢!
解决方法
您可以将一个带有 familyName
的对象作为键并收集该对象。最后只取对象中的值作为结果。
const
data = [{ familyName: "Winston",data: [{},{}] },{ familyName: "Winston",{ familyName: "Levi",{}] }],result = Object.values(data.reduce((r,o) => {
(r[o.familyName] ??= { ...o,data: [] }).data.push(...o.data);
return r;
},{}));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }