所以我在做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?
答案 0 :(得分:0)
我花了一段时间才明白它的工作原理
......但你到底做了什么。它们基本等同于 1 。
是否有一个特定的原因,我不理解或纯粹是文体?
没有具体原因。在风格上,他们的显然更短(更简洁)。由于许多回调函数调用,性能方面的forEach
循环不是很快。 apply
确实有点令人困惑,也不是超级高效。
然而,如果他们寻找简洁的代码,我想知道他们为什么不使用
Array.prototype.mergeAll = function() {
return Array.prototype.concat.apply([], this);
};
1:非数组的细微差别,您的解决方案依赖于.forEach
方法,而apply
依赖于.length
。