我有一个对象数组,它需要根据条件返回和数组



我有一个对象数组,它需要返回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));

最新更新