【问题标题】:Apply.prototype.push.apply vs forEach for nested arrays?Apply.prototype.push.apply vs forEach 用于嵌套数组?
【发布时间】:2015-10-03 14:21:46
【问题描述】:

所以我在做 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] .然后 apply 在这里几乎像 forEach 一样工作,将参数 0 和 1(即 1 和 2)推入结果中。现在结果是 [1,2],然后 forEach 再次触发,参数 0 和 1 是 3 和 4,它们被推送。我花了一段时间才理解它为什么起作用,但这似乎令人困惑,因为它只是在做一个 forEach,对吧?

我不理解是否有必要的特定原因,还是纯粹出于风格?

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

【问题讨论】:

  • 你在作用域链中走得更少,你创建的函数对象更少,你使用核心推送函数并让它在内部数组上循环......确实有很多原因。跨度>

标签: javascript multidimensional-array foreach


【解决方案1】:

我花了一段时间才明白它为什么起作用

……但你最终做到了。它们基本上是等价的1

是否有必要的特定原因我不明白,还是纯粹出于风格?

没有具体原因。从风格上讲,他们的显然更短(更简洁)。在性能方面,forEach 循环不是很快,因为调用了许多回调函数。 apply 确实有点混乱,而且效率也不高。

但是,如果他们寻找简洁的代码,我想知道他们为什么不直接使用

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2018-01-25
    • 1970-01-01
    • 2012-09-24
    相关资源
    最近更新 更多