.map()
方法的典型用法使用回调,该回调按顺序传递数组中的每个元素,对该元素执行某些操作,然后为新数组返回相应的元素。例如:
var arr = [1, 2, 3, 4, 5],
arrMap = arr.map(function(element) {
return element * 2;
})
console.log(arrMap) // [2, 4, 6, 8, 10];
我发现在某些情况下,在尝试维护函数编码样式并避免使用循环时,使用.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);
});
我想知道的是,在没有Array.prototype.map
声明的情况下使用return
是否存在技术上的错误。这是以某种方式反对最佳实践,还是使用.map
来代替使用此技术的循环或递归函数。
答案 0 :(得分:7)
从技术上讲,Array.prototype.map
接受一个数组和一个函数并返回另一个数组。因此,map
用于创建新数组。在第二个示例中,您完全忽略了返回的数组。您可以像这样检查
...
temp = arr1.map(function(element, index) {
obj[element] = arr2[index];
});
console.log(temp);
由于您未明确返回任何内容,因此默认情况下JavaScript返回undefined
。所以temp
将是
[ undefined, undefined, undefined, undefined, undefined ]
这是不必要的。因此,在这种情况下,您应该使用Array.prototype.forEach
而不是map
。这不会像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);
更好的是,在这种情况下使用的最佳功能是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 }
顾名思义, reduce
采用一系列值并将其减少为单个值。在这种情况下,我们在reduce
上使用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 }