如果Array.prototype.map()没有返回,它是否正确使用

时间:2015-03-12 02:59:07

标签: javascript arrays node.js functional-programming

.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来代替使用此技术的循环或递归函数。

1 个答案:

答案 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 }