以索引方式计算数组值的数组



>我从服务器接收到一个对象,看起来像

var response = [
{
"id":"1",
"series":{
"eoy":[10,20,30,40,50,60],
"eom":[20,30,40,50,60],
"now":[30,40,50,60,70,80]
}
}
{
"id":"2",
"series":{
"eoy":[30,40,20,50,10],
"eom":[20,10,50,70,20,50],
"now":[30,10,70,20]
}
}
]

在系列中,有许多键和值。 只是为了解决问题,我写了 3 对。现在我想以这样的方式添加这些数组,以便我将得到的结果作为一个对象,它应该是这样的

var result = {
"eoy":[40,60,50,90,60,60],
"eom":[40,40,90,120,80,50],
"now":[60,50,120,80,70,80]
}

在此,我添加了添加所有 eoys 并将其作为一个数组,并对每个系列成员进行操作。有没有办法制作所有计算值的单个对象。

您可以使用reduce对数组和对象进行分组。使用Object.entries将对象转换为数组。并使用forEach遍历数组。

let arr = [{"id": "1","series": {"eoy": [10, 20, 30, 40, 50, 60],"eom": [20, 30, 40, 50, 60],"now": [30, 40, 50, 60, 70, 80]}},{"id": "2","series": {"eoy": [30, 40, 20, 50, 10],"eom": [20, 10, 50, 70, 20, 50],"now": [30, 10, 70, 20]}}];
let result = arr.reduce((c, {series}) => {
Object.entries(series).forEach(([k, v]) => {
c[k] = c[k] || [];
v.forEach((o, i) => {
c[k][i] = c[k][i] || 0;
c[k][i] += o;
});
})
return c;
}, {});
console.log(result);

如果对象不可用

,可以使用forin循环Object.entries

let arr = [{"id": "1","series": {"eoy": [10, 20, 30, 40, 50, 60],"eom": [20, 30, 40, 50, 60],"now": [30, 40, 50, 60, 70, 80]}},{"id": "2","series": {"eoy": [30, 40, 20, 50, 10],"eom": [20, 10, 50, 70, 20, 50],"now": [30, 10, 70, 20]}}];
let result = arr.reduce((c, {series}) => {
for (var k in series) {
c[k] = c[k] || [];
series[k].forEach((o, i) => {
c[k][i] = c[k][i] || 0;
c[k][i] += o;
});
}
return c;
}, {});
console.log(result);

您可以使用reduce,如下所示:

const input=[{"id":"1","series":{"eoy":[10,20,30,40,50,60],"eom":[20,30,40,50,60],"now":[30,40,50,60,70,80]}},{"id":"2","series":{"eoy":[30,40,20,50,10],"eom":[20,10,50,70,20,50],"now":[30,10,70,20]}}];
const output = input.reduce((a, { series }) => {
Object.entries(series).forEach(([key, arr]) => {
if (!a[key]) a[key] = [];
const sumArr = a[key];
arr.forEach((num, i) => sumArr[i] = (sumArr[i] || 0) + num);
});
return a;
}, {});
console.log(output);
{
"eoy":[40,60,50,90,60,60],
"eom":[40,40,90,120,80,50],
"now":[60,50,120,80,70,80]
}

使用 Array.reduce、Array.forEach 和 Object.entries

var arr = [{"id":"1","series":{"eoy":[10,20,30,40,50,60],"eom":[20,30,40,50,60],"now":[30,40,50,60,70,80]}},{"id":"2","series":{"eoy":[30,40,20,50,10],"eom":[20,10,50,70,20,50],"now":[30,10,70,20]}}];
let result = arr.reduce((a, c) => {
/* For each item in the array, iterate over each entry
** in series and sum it in the accumulator object. */
Object.entries(c.series).forEach(([k, v]) => {
a[k] = a[k] || []; 
v.forEach((n, i) => a[k][i] = a[k][i] ? a[k][i] + n : n);
});
return a;
}, {});
console.log(result);

没有对象条目

var arr = [{"id":"1","series":{"eoy":[10,20,30,40,50,60],"eom":[20,30,40,50,60],"now":[30,40,50,60,70,80]}},{"id":"2","series":{"eoy":[30,40,20,50,10],"eom":[20,10,50,70,20,50],"now":[30,10,70,20]}}];
let result = arr.reduce((a, c) => {
/* For each item in the array, iterate over each entry
** in series and sum it in the accumulator object. */
Object.keys(c.series).forEach((k) => {
let v = c.series[k];
a[k] = a[k] || []; 
v.forEach((n, i) => a[k][i] = a[k][i] ? a[k][i] + n : n);
});
return a;
}, {});
console.log(result);

你可以用map来做到这一点:

map(( 方法创建一个新数组,其中包含对调用数组中的每个元素调用提供的函数的结果。

var arr = [
{
"id":"1",
"series": {
"eoy":[10,20,30,40,50,60],
"eom":[20,30,40,50,60],
"now":[30,40,50,60,70,80]
}
},
{
"id":"2",
"series":{
"eoy":[30,40,20,50,10],
"eom":[20,10,50,70,20,50],
"now":[30,10,70,20]
}
}
];
console.log(arr.map(x=> x.series));

最新更新