JavaScript:使用concat和reduce进行练习

3
我正在处理一个练习,在此练习中,我需要从一个数组的数组开始(即二维数组),使用 reduce 和 concat 方法将其缩减为一个包含每个子数组中所有元素的单一数组。因此,我从以下内容开始:
var array = [[1,2,3],[4,5,6],[7,8,9]]

我用以下方法解决了这个练习:
var new_array = array.reduce(function(prev,cur){return prev.concat(cur);})

所以它可以工作,输入 console.log(new_array) 我得到了这个:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

但如果我这样修改函数:
var new_array = array.reduce(function(prev,cur){return prev.concat(cur);},0)

我得到了这个错误:

"TypeError: prev.concat 不是一个函数

为什么会出现这个错误?

因为你不能将数组连接到0。 - Nenad Vracar
Array.prototype.reduce 的第二个(可选)参数是初始值。在您的情况下,您将 0 作为初始值传递,因此第一次函数运行时,它尝试调用 prev.concat,这显然会失败,因为 Number 没有 concat 方法。 - haim770
你试图通过 reduce 的第二个版本实现什么目标? - Harald Gliebe
感谢大家,我还没有完全清楚 reduce 的工作原理。 - Giacomo Ciampoli
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce - webdeb
1个回答

2
我还没有完全弄清楚 reduce 的工作原理。
reduce 的工作方式如下:
Array.prototype.reduce = function(callback, startValue){
    var initialized = arguments.length > 1,
        accumulatedValue = startValue;

    for(var i=0; i<this.length; ++i){
        if(i in this){
            if(initialized){
                accumulatedValue = callback(accumulatedValue, this[i], i, this);
            }else{
                initialized = true;
                accumulatedValue = this[i];
            }
        }
    }

    if(!initialized)
        throw new TypeError("reduce of empty array with no initial value");
    return accumulatedValue;
}

您的失败示例实际上就是这样做的:

var array = [[1,2,3],[4,5,6],[7,8,9]];

var tmp = 0;
//and that's where it fails.
//because `tmp` is 0 and 0 has no `concat` method
tmp = tmp.concat(array[0]);
tmp = tmp.concat(array[1]);
tmp = tmp.concat(array[2]);

var new_array = tmp;

0替换为一个数组,例如[ 0 ]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接