axd*_*xdg 3 javascript arrays functional-programming node.js
该.map()方法的典型用法使用回调,该回调按顺序传递给数组中的每个元素,对该元素执行一些操作,然后为新数组返回相应的元素.例如:
var arr = [1, 2, 3, 4, 5],
arrMap = arr.map(function(element) {
return element * 2;
})
console.log(arrMap) // [2, 4, 6, 8, 10];
Run Code Online (Sandbox Code Playgroud)
我发现在某些情况下,当尝试维护函数编码风格并避免使用循环时,使用该.map()方法而不必在回调中返回值会很有用.一个.map用于将两个数组转换为对象的人为例子:
var arr1 = ['one', 'two', 'three', 'four', 'five'],
arr2 = [1, 2, 3, 4, 5],
obj = {},
arr1.map(function(element, index) {
obj[element] = arr2(index);
});
Run Code Online (Sandbox Code Playgroud)
我想知道的是,在Array.prototype.map没有return声明的情况下使用是否存在技术上的错误.这是以某种方式反对最佳实践,还是使用.map此技术代替循环或递归函数是好的.
从技术上讲,Array.prototype.map获取一个数组和一个函数并返回另一个数组.所以,map用于创建一个新数组.在第二个示例中,您完全忽略了返回的数组.你可以这样检查一下
...
temp = arr1.map(function(element, index) {
obj[element] = arr2[index];
});
console.log(temp);
Run Code Online (Sandbox Code Playgroud)
由于您没有显式返回任何内容,因此undefined默认情况下JavaScript返回.所以temp会
[ undefined, undefined, undefined, undefined, undefined ]
Run Code Online (Sandbox Code Playgroud)
这是不必要的.所以,在这种情况下map,你应该使用Array.prototype.forEach它.这不会像创建一样创建数组map.
var arr1 = ['one', 'two', 'three', 'four', 'five'],
arr2 = [1, 2, 3, 4, 5],
obj = {};
arr1.forEach(function(element, index) {
obj[element] = arr2[index];
});
console.log(obj);
Run Code Online (Sandbox Code Playgroud)
更好的是Array.prototype.reduce,在这种情况下使用的最佳功能是,可以像这样使用
var arr1 = ['one', 'two', 'three', 'four', 'five'],
arr2 = [1, 2, 3, 4, 5],
obj = arr1.reduce(function(result, currentElement, index) {
result[currentElement] = arr2[index];
return result;
}, {});
console.log(obj);
// { one: 1, two: 2, three: 3, four: 4, five: 5 }
Run Code Online (Sandbox Code Playgroud)
reduce顾名思义,它采用一系列值并将其减少为单个值.在这种情况下,我们使用reduceon arr1并arr1在每次迭代时通过将当前键和值存储在result最终返回的对象中来减少.
注意:由于您使用的是Node.js,您可以安装一个函数式编程库,如下划线或lodash,然后简单地执行此任务_.object,就像这样
var _ = require("underscore"),
arr1 = ['one', 'two', 'three', 'four', 'five'],
arr2 = [1, 2, 3, 4, 5];
console.log(_.object(arr1, arr2));
// { one: 1, two: 2, three: 3, four: 4, five: 5 }
Run Code Online (Sandbox Code Playgroud)