Array.prototype.map() 如果没有被正确使用 return
Is Array.prototype.map() being used properly if it does not return
.map()
方法的典型用法是使用一个回调,依次传递数组中的每个元素,对该元素执行一些操作,然后 returns 一个新数组的相应元素.例如:
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);
});
我想知道的是,在没有 return
语句的情况下使用 Array.prototype.map
在技术上是否存在任何错误。这是否在某种程度上违反了最佳实践,或者使用 .map
代替循环或递归函数与此技术是否合适。
从技术上讲,Array.prototype.map
接受一个数组和一个函数,returns 接受另一个数组。因此,map
用于创建一个新数组。在你的第二个例子中,你完全忽略了返回的数组。你可以这样检查
...
temp = arr1.map(function(element, index) {
obj[element] = arr2[index];
});
console.log(temp);
由于您没有明确返回任何内容,因此默认情况下 JavaScript returns 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
,顾名思义,获取一组值并将其缩减为单个值。在这种情况下,我们在 arr1
上使用 reduce
并在每次迭代中减少 arr1
,方法是将当前键和值存储在最终返回的 result
对象中.
注意:因为你使用的是Node.js,你可以安装一个函数式编程库,比如下划线或lodash,然后用[=31=简单地完成这个任务],像这样
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 }
.map()
方法的典型用法是使用一个回调,依次传递数组中的每个元素,对该元素执行一些操作,然后 returns 一个新数组的相应元素.例如:
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);
});
我想知道的是,在没有 return
语句的情况下使用 Array.prototype.map
在技术上是否存在任何错误。这是否在某种程度上违反了最佳实践,或者使用 .map
代替循环或递归函数与此技术是否合适。
从技术上讲,Array.prototype.map
接受一个数组和一个函数,returns 接受另一个数组。因此,map
用于创建一个新数组。在你的第二个例子中,你完全忽略了返回的数组。你可以这样检查
...
temp = arr1.map(function(element, index) {
obj[element] = arr2[index];
});
console.log(temp);
由于您没有明确返回任何内容,因此默认情况下 JavaScript returns 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
,顾名思义,获取一组值并将其缩减为单个值。在这种情况下,我们在 arr1
上使用 reduce
并在每次迭代中减少 arr1
,方法是将当前键和值存储在最终返回的 result
对象中.
注意:因为你使用的是Node.js,你可以安装一个函数式编程库,比如下划线或lodash,然后用[=31=简单地完成这个任务],像这样
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 }