我正在尝试为js Array原型实现一个重复的方法,该方法将数组的副本连接到自身,如下所示:
[11,22,3,34,5,26,7,8,9].duplicate(); // [11,22,3,34,5,26,7,8,9,11,22,3,34,5,26,7,8,9]
这就是我所拥有的,但它会导致浏览器崩溃:
var array = [11,22,3,34,5,26,7,8,9];
Array.prototype.duplicate = function() {
var j = this.length;
for(var i = 0; i < this.length; i++) {
this[j] = this[i];
j++;
}
return this;
}
我正在尝试使用原生JS作为迭代和算法的实践,所以我试图避免使用内置方法,如果可能的话,这样我就可以更清楚地了解事情是如何被移动的。
关于它崩溃的原因以及我如何优化它的任何想法?
答案 0 :(得分:6)
循环中的代码会改变数组的长度,所以它会不断增长,你永远不会到达它的末尾。获取变量中数组的初始长度并在循环条件中使用。您也可以将其用作目标索引的偏移量,而不是另一个计数器:
var array = [11,22,3,34,5,26,7,8,9];
Array.prototype.duplicate = function() {
var len = this.length;
for (var i = 0; i < len; i++) {
this[len + i] = this[i];
}
return this;
}
答案 1 :(得分:1)
添加每个元素后,数组的长度会增加,因此您不能将其用作终结符。试试这个。
var j = this.length;
for(var i = 0; i < j; i++) {
this[i+j] = this[i];
}
答案 2 :(得分:1)
这是最简单的代码
Array.prototype.duplicate = function () {
var array = this;
return array.concat(array);
};
答案 3 :(得分:1)
使用Spread语法; 在方法中,this 指的是 owner 对象。
Array.prototype.duplicate = function () {
return [...this, ...this]
};
let array = [1,2,3,4,5];
Array.prototype.duplicate = function () {
return [...this, ...this]
};
console.log(array.duplicate());