将对象数组缩减为单个对象,其值是旧数组中值的串联



我有一个对象数组,我想将其简化为一个对象。示例数组的每个对象中总是有相同的键,如下所示:

sample = [
{australia: 0, belgium: 0, brazil: 0, canada: 1, china: 1, ...},
{australia: 0, belgium: 0, brazil: 3, canada: 2, china: 2, ...},
{australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5, ...}
]

我希望获得一个单独的对象,其中键与对象中的键相同,并且值是初始数组中每个值的串联。类似这样的东西:

desiredResult: {australia:[0,0,2],belgium:[0,0,1],brazil:[0,3,4],canada:[1,2,2],china:[1,2,5],...}

到目前为止,我一直在数组上尝试以下reduce方法,但我缺少连接所有值的部分:

let desiredResult = sample.reduce((a,b) =>({...a, desiredResult: b}),{})
// Which results in:
// desiredResult: {australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5}

?你能帮我找出达成这个解决方案的最佳方法吗?

您可以获取条目并创建新属性作为数组,然后将值推送给它。

var sample = [{ australia: 0, belgium: 0, brazil: 0, canada: 1, china: 1 }, { australia: 0, belgium: 0, brazil: 3, canada: 2, china: 2 }, { australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5 }],
result = sample.reduce((r, o) => {
Object.entries(o).forEach(([k, v]) => (r[k] = r[k] || []).push(v));
return r;
}, {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

由于数组中的每个元素都是一个对象,因此需要对它们进行迭代

let sample = [{
'australia': 0,
'belgium': 0,
'brazil': 0,
'canada': 1,
'china': 1
},
{
'australia': 0,
'belgium': 0,
'brazil': 3,
'canada': 2,
'china': 2
},
{
'australia': 2,
'belgium': 1,
'brazil': 4,
'canada': 2,
'china': 5
}
];
let newData = sample.reduce((acc, curr) => {
for (let keys in curr) {
if (!acc[keys]) {
acc[keys] = []
}
acc[keys].push(curr[keys])
}
return acc;
}, {});
console.log(newData)

您可以尝试reduce,方法是以键、值的形式获取元素的条目,然后使用accumulator中的for..of相应地推送它们:

var sample = [{ australia: 0, belgium: 0, brazil: 0, canada: 1, china: 1 }, { australia: 0, belgium: 0, brazil: 3, canada: 2, china: 2 }, { australia: 2, belgium: 1, brazil: 4, canada: 2, china: 5 }]

const result= sample.reduce((acc, elem)=>{
countries= Object.entries(elem); 
for(const [country, count] of countries){
	  acc[country]= acc[country] || [];
	  acc[country].push(count);
	}
	return acc;
},{});
console.log(result);

最新更新