如何获取取决于键值的数组的和



我有如下格式的object

let objs = [
{Name : 'A', Y1 : '1', Y2 : '1',Y3 : '1'}
{Name : 'B', Y1 : '2', Y2 : '3',Y3 : '3'}
{Name : 'C', Y1 : '1', Y2 : '1',Y3 : '6'}
]

我想实现如下目标:

{Name : 'Total', Y1 : '4', Y2 : '5',Y3 : '10'}

我已经厌倦了使用.reduced来创建对象,但我认为还有更有效的方法来创建对象。

let a = objs.reduce((total, obj) => obj['Y1'] + total, 0)
let b = objs.reduce((total, obj) => obj['Y2'] + total, 0)
let c = objs.reduce((total, obj) => obj['Y3'] + total, 0)
//then create new object and merge with exiting object

我怎样才能更有效地实现目标?

我们可以将3个reduce合并为1个reduce,如下所示:

let objs = [
{Name : 'A', Y1 : '1', Y2 : '1',Y3 : '1'},
{Name : 'B', Y1 : '2', Y2 : '3',Y3 : '3'},
{Name : 'C', Y1 : '1', Y2 : '1',Y3 : '6'}
]

let result1 = objs.reduce((a,c) =>{
a.Y1 += +c.Y1
a.Y2 += +c.Y2
a.Y3 += +c.Y3
return a
},{'Name':'Total','Y1':0,'Y2':0,'Y3':0})
console.log(result1)
let result2 = objs.reduce((a,{Y1,Y2,Y3}) =>{
a.Y1 += +Y1
a.Y2 += +Y2
a.Y3 += +Y3
return a
},{'Name':'Total','Y1':0,'Y2':0,'Y3':0})
console.log(result2)


更新:使用动态键

let objs = [
{Name : 'A', Y1 : '1', Y2 : '1',Y3 : '1'},
{Name : 'B', Y1 : '2', Y2 : '3',Y3 : '3'},
{Name : 'C', Y1 : '1', Y2 : '1',Y3 : '6'}
]

let result = objs.reduce((a,c) =>{
let keys = Object.keys(c).slice(1)
keys.forEach(k => {
a[k] += +c[k] 
})
return a
},{'Name':'Total','Y1':0,'Y2':0,'Y3':0})
console.log(result)

您可以这样做;

let y1 = 0;
let y2 = 0;
let y3 = 0; 
let objs = [
{"Name" : 'A', "Y1" : '1', "Y2" : '1', "Y3" : '1'},
{"Name" : 'B', "Y1" : '2', "Y2" : '3', "Y3" : '3'},
{"Name" : 'C', "Y1" : '1', "Y2" : '1', "Y3" : '6'}
]
objs.forEach((e)=>{
y1 = y1 + parseInt(e["Y1"]);
y2 = y2 + parseInt(e["Y2"]);
y3 = y2 + parseInt(e["Y3"]);
});
console.log(y1);
console.log(y2);
console.log(y3);

用动态键值对改进flyinbox的答案:

let objs = [
{Name : 'A', Y1 : '1', Y2 : '1',Y3 : '1', Y4: 'foo', Y5: '1'},
{Name : 'B', Y1 : '2', Y2 : '3',Y3 : '3', Y4: '2'},
{Name : 'C', Y1 : '1', Y2 : '1',Y3 : '6', Y5: 'bar'}
]

let result = objs.reduce((a,c) =>{
const copy = {...c};
delete copy.Name;
const keys = Object.keys(copy)
for (const k of keys) {
const num = parseInt(c[k]);
if (isNaN(num)) continue;
if (a[k] === undefined) a[k] = 0;
a[k] += num; 
}
return a
},{'Name':'Total'})
console.log(result)

let objs = [
{ Name: "A", Y1: "1", Y2: "1", Y3: "1" },
{ Name: "B", Y1: "2", Y2: "3", Y3: "3" },
{ Name: "C", Y1: "1", Y2: "1", Y3: "6" },
];
let tempY1 = 0;
let tempY2 = 0;
let tempY3 = 0;
for (let i = 0; i < objs.length; i++) {
tempY1 += parseInt(objs[i].Y1);
tempY2 += parseInt(objs[i].Y2);
tempY3 += parseInt(objs[i].Y3);
}
let newObj = { name: "total", Y1: tempY1, Y2: tempY2, Y3: tempY3 };
console.log(newObj);

在这个解决方案中,我们只需通过for循环获得所有键值的总和,您需要将其存储在临时变量中,在完成for循环后,您就可以在问题中获得所需的数据。

如果有任何困惑,请发表评论。

感谢

使用lodash-将对象数组扩展到_.mergeWith()中,逻辑是对除Name之外的所有键的数值求和。如果密钥是CCD_ 6返回"0";总计":

const objs = [{Name : 'A', Y1 : '1', Y2 : '1',Y3 : '1'},   {Name : 'B', Y1 : '2', Y2 : '3',Y3 : '3'}, {Name : 'C', Y1 : '1', Y2 : '1',Y3 : '6'}]

const result = _.mergeWith({}, ...objs, (a = 0, b, key) => 
key === 'Name' ? 'Total' : a + +b
)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

如果求和也是字符串,请使用String():包装求和表达式

const objs = [{Name : 'A', Y1 : '1', Y2 : '1',Y3 : '1'},   {Name : 'B', Y1 : '2', Y2 : '3',Y3 : '3'}, {Name : 'C', Y1 : '1', Y2 : '1',Y3 : '6'}]

const result = _.mergeWith({}, ...objs, (a = 0, b, key) => 
key === 'Name' ? 'Total' : String(+a + +b)
)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js" integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

注意:我使用一元加(+)将字符串转换为数字,因此此表达式+a + +b将两个参数转换为数字并相加。

最新更新