Javascript 使用reduce更改数组项。坏模式?

Javascript 使用reduce更改数组项。坏模式?,javascript,arrays,Javascript,Arrays,关于Javascript中Array.reduce的良好使用,我有一个问题。 假设我有一个包含一些简单对象的数组,如下所示: let values = [{value: 2}, {value: 3}, {value: 8}, {value: 11}]; let values = [ {value: 2}, {value: 3, diff: 1}, {value: 8, diff: 5}, {value: 11, diff: 3} ]; 我想给每个对象添加一个“diff”

关于Javascript中Array.reduce的良好使用,我有一个问题。 假设我有一个包含一些简单对象的数组,如下所示:

let values = [{value: 2}, {value: 3}, {value: 8}, {value: 11}];
let values = [
  {value: 2}, 
  {value: 3, diff: 1}, 
  {value: 8, diff: 5}, 
  {value: 11, diff: 3}
];
我想给每个对象添加一个“diff”属性来计算当前项值和前一项值之间的差值。我想要这样的东西:

let values = [{value: 2}, {value: 3}, {value: 8}, {value: 11}];
let values = [
  {value: 2}, 
  {value: 3, diff: 1}, 
  {value: 8, diff: 5}, 
  {value: 11, diff: 3}
];
为了实现这一点,我决定使用Array.reduce方法。我使用reduce是因为我可以访问当前项目和最新项目,但在这种情况下,我对reduced数组不感兴趣

values.reduce((acc, cur) => {
  if (acc.value) {
    cur.diff = cur.value - acc.value;
  }
  return cur;
}, {});
这是Array.reduce的一个好用法吗?我不喜欢我改变原始数组项的方式,但另一方面reduce是唯一可以访问前一个项的数组方法。也许在这种情况下,一个简单的for of循环应该更好

谢谢,您可以使用,因为您已经可以访问前置版本

优点是,您没有返回值的开销

let values=[{value:2},{value:3},{value:8},{value:11}];
forEach((a,i,aa)=>i&(a.diff=a.value-aa[i-1].value));
console.log(值)

.as console wrapper{max height:100%!important;top:0;}
来自doc:reduce()方法对累加器和数组的每个值(从左到右)应用函数以将其减少为单个值。如果使用得当,这是个人的首选。您正在使用reduce来保存一个值,而不是它的预期用途。有些人会觉得它很聪明,有些人会讨厌它。@Kinduser,reduce返回一个值。在本例中,它用作上一个索引的值。该值不会更改,因此无需将其用作临时排序。mutating是一个不同的字段,任何数组迭代方法都不会按设计对数组进行变异。