Javascript:为什么数组变量赋值在此函数内外的行为方式不同?

时间:2015-06-05 16:05:13

标签: javascript arrays concat reduce

对于我的生活,我无法弄清楚我在这里做错了什么。

我试图同时使用reduce和concat数组方法来获取2d数组的所有值并将它们组合成单个值(基本上将它们压缩成一个数组,然后将它们相加)。

我一直遇到的问题是当我尝试使用for / loop来连接每个数组元素时,我传入函数的参数不会被识别为数组,因此我的调用到.concat()失败了。我在函数的开头放置了一个console.log(),以查看该元素是否被识别为2d数组中的第一个数组元素,并且它将作为" 1& #34;(?)。

我在函数外部尝试了另一个测试,并将其记录为实际的数组元素。我在这做错了什么?代码如下:

var arrays = [[1, 2, 3], [4, 5], [6]];

var myArray = arrays[0]; // Test
console.log(myArray); // Test

var flatArray = arrays.reduce(function(arrays)
{
    console.log(arrays[0]); // Test

    for (var i = 0; i < arrays.length - 1; i++)
    {
        arrays[0].concat(arrays[i+1]);
    }
    return arrays;

});

console.log(flatArray);

这是我不断获得的输出:

Array [ 1, 2, 3 ]
1
TypeError: arrays[0].concat is not a function

在函数内部,数组似乎正在被转换为数字类型......?

3 个答案:

答案 0 :(得分:3)

您的代码中有错误:

var flatArray = arrays.reduce(function(param) {})

该param将是数组向量的元素

选中此https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

答案 1 :(得分:1)

您错误地使用了.reduce(),甚至不需要使用它来展平数组。你可以这样做:

var flatArray = [].concat.apply([],arrays);

工作演示:http://jsfiddle.net/jfriend00/wfjyfp42/

要理解.reduce(),您传递的回调会获得四个参数(请参阅MDN reference)。前两个参数对于正确使用.reduce()非常重要:

callback(previousValue, currentValue, index, array)

previousValue是到目前为止减少的累计值。 currentValue是正在迭代的数组的下一个元素。如果不需要,不需要使用最后两个参数。

您的代码仅使用previousValue,因此永远不会查看.reduce()传入的数组中的下一个项目。

您可以使用.reduce()像这样制作解决方案:

var flatArray = arrays.reduce(function(previousValue, currentValue) {
    return previousValue.concat(currentValue);
}, []);

工作演示:http://jsfiddle.net/jfriend00/2doohfc5/

答案 2 :(得分:1)

Reduce对两个元素执行操作。

var sum = [[1, 2, 3], [4, 5], [6]].reduce(function(a, b) { 
    return a.concat(b);
}).reduce(function(a, b) { 
    return a + b;
});