对于嵌套数组,Apply.prototype.push.apply vs forEach?

时间:2015-07-14 19:06:46

标签: javascript multidimensional-array foreach

所以我在做LearnRx http://reactive-extensions.github.io/learnrx/ 我有一个关于制作mergeAll()函数的问题(问题10)。

这是我的答案,但通过但不是"规范。"

Array.prototype.mergeAll = function() {
    var results = [];
    this.forEach(function(subArray) {
        subArray.forEach(function(item){
          results.push(item);
        });
    });
     return results;
};

他们的首选答案:

Array.prototype.mergeAll = function() {
    var results = [];
    this.forEach(function(subArray) {
        results.push.apply(results, subArray);
    });
     return results;

};

好吧,如果我们采用一个起始数组[[1,2],[3,4]],forEach会发射两次,第一次传递[1,2]并且[3,4] ]第二次。然后在这里应用几乎像forEach的工作,将参数0和1(1和2)推入结果中。现在结果是[1,2],然后forEach再次触发,参数0和1分别为3和4,它们被推动。我花了一段时间才明白它为什么会起作用,但它似乎令人困惑,因为它只是在做一个forEach,对吧?

是否有一个特定的原因,我不理解或纯粹风格?

另外,我有一个较小的问题:为什么在Array.prototype.push.apply更明确且不需要攀登原型链的时候写一下results.push.apply?

1 个答案:

答案 0 :(得分:0)

  

我花了一段时间才明白它的工作原理

......但你到底做了什么。它们基本等同于 1

  

是否有一个特定的原因,我不理解或纯粹是文体?

没有具体原因。在风格上,他们的显然更短(更简洁)。由于许多回调函数调用,性能方面的forEach循环不是很快。 apply确实有点令人困惑,也不是超级高效。

然而,如果他们寻找简洁的代码,我想知道他们为什么不使用

Array.prototype.mergeAll = function() {
    return Array.prototype.concat.apply([], this);
};

1:非数组的细微差别,您的解决方案依赖于.forEach方法,而apply依赖于.length