我有一个对象数组,它需要返回sum数组。如果className.value相同,则添加Area.value值,否则只返回单个值,
var obj = [{
Area: {
type: 'double',
value: 150
},
className: {
type: 'string',
value: "gold"
}
},
{
Area: {
type: 'double',
value: 130
},
className: {
type: 'string',
value: "silver"
}
},
{
Area: {
type: 'double',
value: 250
},
className: {
type: 'string',
value: "gold"
}
},
];
console.log(obj)
//expecting this array to return
console.log([400,130])
您可以对数组执行reduce
运算,将具有相同className.value
的元素与对象相加。
var obj = [{ Area: { type: 'double', value: 150 }, className: { type: 'string', value: "gold" } }, { Area: { type: 'double', value: 130 }, className: { type: 'string', value: "silver" } }, { Area: { type: 'double', value: 250 }, className: { type: 'string', value: "gold" } }, ];
const res = Object.values(
obj.reduce((acc,curr)=>{
acc[curr.className.value] = (acc[curr.className.value] || 0) + curr.Area.value;
return acc;
}, {})
);
console.log(res);
有效地只是循环通过对象并说明未定义。使用className.value作为元素名称以避免重复。
function calculateValues(obj) {
var output = [];
for (var key in obj) {
output[obj[key].className.value] = (obj[key].className.value in output ? output[obj[key].className.value] : 0) + obj[key].Area.value;
}
return output;
}
console.log(calculateValues(obj));
使用Array#reduce来汇总不同类的值。如果累加器中有一个具有当前对象类名的属性,则使用Object#hasOwnProperty进行查看。如果不是这样,那么添加一个具有此名称的值(例如"gold"(,并将当前对象的值添加到此。否则,直接将值添加到此属性中
在用reduce对该对象求和之后,我用object#值得到object中的值作为数组。最后,我只需要看看数组是否只有1个条目。如果是,则将其作为值返回,否则返回数组。
function makeSum(arr) {
let result = Object.values(arr.reduce((acc, cur) => {
let classVal = cur.className.value;
if (!acc.hasOwnProperty(classVal)) {
acc[classVal] = cur.Area.value;
} else {
acc[classVal] += cur.Area.value;
}
return acc;
},{}));
if (result.length===1) result = result[0];
return result;
}
let arr = [{ Area: { type: 'double', value: 150 }, className: { type: 'string', value: "gold" } }, { Area: { type: 'double', value: 130 }, className: { type: 'string', value: "silver" } }, { Area: { type: 'double', value: 250 }, className: { type: 'string', value: "gold" } }, ];
console.log(makeSum(arr));