2

我正在尝试对 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 作为迭代和算法的练习来做到这一点,因此我尽量避免使用内置方法,以便我可以更清楚地了解事物是如何移动的。

关于它为什么崩溃以及如何优化它的任何想法?

4

4 回答 4

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;
}
于 2013-08-15T21:50:43.047 回答
1

数组的长度随着添加的每个元素而增加,因此您不能将其用作终止符。尝试这个。

var j = this.length;

for(var i = 0; i < j; i++) {
    this[i+j] = this[i];
}
于 2013-08-15T21:51:21.567 回答
1

这是最简单的代码

Array.prototype.duplicate = function () {
    var array = this;
    return array.concat(array);
};
于 2014-09-08T14:57:35.023 回答
1

使用传播语法;在方法中,this指的是所有者对象

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());

于 2021-02-28T12:44:56.360 回答