【发布时间】: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