我正在尝试使用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);
答案 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.forEach
或Array.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 ') )