使用reduce来改变数组项。糟糕的模式?

时间:2017-03-06 14:10:37

标签: javascript arrays

我有一个关于Javascript中Array.reduce的良好用法的问题。 假设我有一个包含这样一些简单对象的数组:

let values = [{value: 2}, {value: 3}, {value: 8}, {value: 11}];

我想为每个对象添加一个“diff”属性,以计算当前项值和前一项值之间的差异。我想要这样的东西:

let values = [
  {value: 2}, 
  {value: 3, diff: 1}, 
  {value: 8, diff: 5}, 
  {value: 11, diff: 3}
];

为了实现这一点,我决定使用Array.reduce方法。我使用reduce是因为我可以访问当前项目以及最新项目,但在这种情况下我对减少的数组不感兴趣。

values.reduce((acc, cur) => {
  if (acc.value) {
    cur.diff = cur.value - acc.value;
  }
  return cur;
}, {});

这是Array.reduce的一个很好的用法吗?我不喜欢我改变原始数组的项目的方式,但另一方面,reduce是唯一可以访问前一项的数组方法。在这种情况下,一个简单的for-of循环应该更好吗?

由于

1 个答案:

答案 0 :(得分:5)

您可以使用Array#forEach,因为您已经可以访问前任。

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

.as-console-wrapper { max-height: 100% !important; top: 0; }
<meta property="twitter:card" content="summary_large_image"/>
<meta property="twitter:site" content="@abc"/>
<meta property="twitter:title" content="dummy text"/>
<meta property="twitter:description" content="dummy text"/>
<meta property="twitter:url" content="http://example.com/example"/>
<meta property="twitter:image:src" content="http://example.com/wp-content/uploads/2017/03/example.jpg"/>
<meta property="twitter:domain" content="The Example"/>