将一个对象数组累加到另一个对象数组中的Javascript

6

我有一个对象数组:

var myArray = [
    {
        "date" : "03/01/2017",
        "value" : 2
    },  {
        "date" : "04/01/2017",
        "value" : 6
    },  {
        "date" : "05/01/2017",
        "value" : 4
    }
];

我需要累加值并保留相同的数组及其更新后的值。
结果应如下所示。
var myArray = [
    {
        "date" : "03/01/2017",
        "value" : 2
    },  {
        "date" : "04/01/2017",
        "value" : 8 //(2+6)
    },  {
        "date" : "05/01/2017",
        "value" : 12 //(2+6+4)
    }
];

我知道这个存在。
[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array) {
  return accumulator + currentValue;
});

但我找不到一个返回对象的示例,该对象也返回其他对象

4个回答

5

使用Array.prototype.forEachthis参数来累加 - 请参见下面的演示:

var myArray=[{"date":"03/01/2017","value":2},{"date":"04/01/2017","value":6},{"date":"05/01/2017","value":4}];

myArray.forEach(function(e){
  this.count = (this.count || 0) +  e.value;
  e.value = this.count;
},Object.create(null));

console.log(myArray);
.as-console-wrapper{top:0;max-height:100%!important;}


1
为什么不用{}代替Object.create(null)?无论如何都是不错的方法。 - Pablo Lozano
{} 包括继承的原型... Object.create(null) 可以避免它们... - kukkuz

3
您可以使用map()Object.assign()来复制对象。

var myArray = [{
  "date": "03/01/2017",
  "value": 2
}, {
  "date": "04/01/2017",
  "value": 6
}, {
  "date": "05/01/2017",
  "value": 4
}];

var result = myArray.map(function(o) {
  var obj = Object.assign({}, o)
  obj.value = this.total += o.value
  return obj
}, {total: 0})

console.log(result)


2

举个不同的例子来回答你关于.reduce()的问题,你可以这样使用reduce:

var myArray = [
    {
        "date" : "03/01/2017",
        "value" : 2
    },  {
        "date" : "04/01/2017",
        "value" : 6
    },  {
        "date" : "05/01/2017",
        "value" : 4
    }
];

function accumulate() {
  var count = 0;
  return myArray.reduce(function(acc, cur) {
    count += cur.value || 0;
    cur.value = count;
    acc.push(cur);
    return acc;
  }, []);
}

console.log(accumulate(myArray));


1
简单的forEach,直接在数组中进行变异。

var myArray = [
    {
        "date" : "03/01/2017",
        "value" : 2
    },  
    {
        "date" : "04/01/2017",
        "value" : 6
    },  
    {
        "date" : "05/01/2017",
        "value" : 4
    }
];

myArray.forEach(
  (e,i,arr) => e.value += i && arr[i-1].value // only fires if i is truthy (i>0)
);      

console.log(myArray);
.as-console-wrapper{top:0;max-height:100%!important;}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接