如何使用reduce()来模仿forEach()的功能?

时间:2017-12-09 03:38:17

标签: javascript foreach reduce

我正在尝试使用reduce()来完成我知道如何处理forEach()的任务。不幸的是,我不确定如何构造语法,我找不到一个好的例子。

示例1)在此代码中,我使用forEach()将单词species插入每个数组的第一个索引中。

"use strict";

var creatureArray;

creatureArray = [
  ['zombie', 30, 1, 'bite', 0, 5],
  ['skeleton', 10, 2, 'sword', 1, 10],
  ['orc', 15, 4, 'club', 1, 7]
];

creatureArray.forEach(function(value, index, array) {
  array[index].unshift('species');
});

console.log(creatureArray);

示例2)在此代码中,我尝试使用.reduce()完成类似的操作。但是我知道我错过了一段语法。我无法弄清楚如何将更新的数组应用于累加器,然后作为对象返回。非常感谢您的帮助!

"use strict";

var creatureArray, creatureObject;

creatureArray = [
  ['zombie', 30, 1, 'bite', 0, 5],
  ['skeleton', 10, 2, 'sword', 1, 10],
  ['orc', 15, 4, 'club', 1, 7]
];

creatureObject = creatureArray.reduce(function(accumulator, currentValue, index, array) {
  array[index].unshift('species');
  //what goes here?
  return accumulator;
}, {});

console.log(creatureObject);

2 个答案:

答案 0 :(得分:3)

以下是如何完成它。

"use strict";

var creatureArray, creatureObject;

creatureArray = [
  ['zombie', 30, 1, 'bite', 0, 5],
  ['skeleton', 10, 2, 'sword', 1, 10],
  ['orc', 15, 4, 'club', 1, 7]
];

creatureObject = creatureArray.reduce((accumulator, currentValue) => {
  return [...accumulator, ['species', ...currentValue]];
}, []);

console.log(creatureObject);

上面的...语法称为Spread Operator

当应用它时,它会将数组的元素扩展为由封闭的[]创建的新数组,将旧数组中的每个元素作为顶级元素放入新数组中。这导致平面数组而不是嵌套数组。例如[[1, 2]] - > [[1, 2]],但[...[1, 2]] - > [1, 2]。 这非常有用,因为它既可以在扩展数组之前或之后插入简单级联,也可以插入顶级元素。

考虑:

"use strict";

const names = ['Linus', 'Jane', 'David'];

const withJakeAppended = [...names, 'Jake'];

const withJakePrepended = ['Jake', ...names];

[names, withJakeAppended, withJakePrepended].forEach(xs => console.log(xs));

正如您所看到的,当我们传播数组时,它不会被修改,因此令人愉快的语法还可以改进人体工程学,以实现不可变的,面向价值的编程。

更好的是,...也适用于套装和地图。事实上,它适用于任何Iterable对象,包括我们自己创建的对象。

我可能会补充说,使用Array.prototype.forEachArray.prototype.forEach的第四个参数是一种应该避免的不良做法。

请注意,如果您需要在没有ES2015支持的浏览器中执行此操作,则可以编写

"use strict";

var creatureArray, creatureObject;

creatureArray = [
  ['zombie', 30, 1, 'bite', 0, 5],
  ['skeleton', 10, 2, 'sword', 1, 10],
  ['orc', 15, 4, 'club', 1, 7]
];

creatureObject = creatureArray.reduce(function (accumulator, currentValue) {

  return accumulator.concat([['species'].concat(currentValue)]);
}, []);

console.log(creatureObject);

答案 1 :(得分:2)

在这种情况下,

map更合适:



var creatureArray = [ ['zombie'  , 30, 1, 'bite' , 0,  5],
                      ['skeleton', 10, 2, 'sword', 1, 10],
                      ['orc'     , 15, 4, 'club' , 1,  7] ]

var creatureObject = creatureArray.map(currentValue => ['species', ...currentValue] )

console.log( JSON.stringify( creatureObject ).replace(/],/g, '],\n ') )