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

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此技术代替循环或递归函数是好的.

the*_*eye 7

从技术上讲,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 arr1arr1在每次迭代时通过将当前键和值存储在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)