在JavaScript中创建数组的多个副本

时间:2019-05-29 02:23:15

标签: javascript arrays

我想创建一个数组的多个副本,副本最多只能有5个。我一直在尝试这样做。

let numbers = [1, 2, 3];
let numbersCopy = [];

for (i = 0; i < 5; i++) {  
  numbersCopy[i] = numbers;
}

console.log(numbersCopy);

但是我正在获取循环对象引用。我该如何解决?

6 个答案:

答案 0 :(得分:1)

变量numbers拥有对该数组的引用,并且您正在将该引用复制到新数组中,因此您将获得一个数组,该数组具有对同一object的多个引用({{1 }}是Java语言array的一种特殊类型。每次创建阵列的新克隆的一种可能的解决方案是将object散布到新的阵列中:

numbers
let numbers = [1, 2, 3];
let numbersCopy = [];

for (i = 0; i < 5; i++)
{  
    numbersCopy[i] = [...numbers];
}

console.log(numbersCopy);

此外,您可以使用Array.from()来执行以下操作:

.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
let numbers = [1, 2, 3];
let numbersCopy = Array.from({length: 5}, _ => [...numbers]);
console.log(numbersCopy);

答案 1 :(得分:1)

为此,您也可以使用Object.assign

let numbers = [1, 2, 3];
let numbersCopy = Object.assign([], numbers);  // <-- shallow clone array

numbers[0] = 22  // <-- modify original array

console.log(numbersCopy)  // [1,2,3]

或者可以使用Array.concat

let numbers = [1, 2, 3];
let numbersCopy = numbers.concat()  // <-- shallow clone array

numbers[0] = 22  // <-- modify original array

console.log(numbersCopy)  // [1,2,3]

Array.from

let numbers = [1, 2, 3];
let numbersCopy = Array.from(numbers)  // <-- shallow clone array

numbers[0] = 22  // <-- modify original array

console.log(numbersCopy)  // [1,2,3]

正如已经指出的Array.sliceES6 spread

let numbers = [1, 2, 3];
let numbersCopy = numbers.slice()  // <-- shallow clone array

// or

let numbersCopy2 = [...numbers]  // <-- shallow clone array

console.log(numbersCopy)   // [1,2,3]
console.log(numbersCopy2)  // [1,2,3]

请注意,这对array of primitives来说很好。对于对象数组,情况有所不同,因为您必须通过Object.assign / spread等分别克隆每个对象。

答案 2 :(得分:1)

这听起来像:“我想要一个新数组,该数组最多复制旧数组的前五个元素”。该函数是slice()

const oldArray = [0,1,2,3,4,5,6];
const newArray = oldArray.slice(0,5); // [0,1,2,3,4]

您可以使用切片通过以下方式创建副本:

  1. oldArray.slice() = [0、1、2、3、4、5] =进行复制,相同= [... oldArray]
  2. oldArray.slice(-2) = [5,6] =数组的最后两项。
  3. oldArray.slice(0,5) = [0、1、2、3、4] =前五个项目
  4. oldArray.slice(5) =剩下的前五个= [5,6]
  5. oldArray.slice(2,3) =接受项目2和3 = [2,3]

继续入侵JavaScript!

答案 3 :(得分:1)

如果数组是原始数组(不包含对象或数组),则可以使用.slice()

let numbers = [1, 2, 3];
let numbersCopy = [];

for (i = 0; i < 5; i++) {  
  numbersCopy[i] = numbers.slice();
}

console.log(numbersCopy);

如果它不是原始数组,请使用JSON.parse(JSON.stringify())

let numbers = [[1], {a: 2}, 3];
let numbersCopy = [];

for (i = 0; i < 5; i++) {  
  numbersCopy[i] = JSON.parse(JSON.stringify(numbers));
}

numbers[0] = 0;

console.log(numbersCopy);

答案 4 :(得分:0)

使用slice获得更优雅的解决方案:

let numbers = [1, 2, 3];
let numbersCopy = numbers.slice();
console.log(numbersCopy);

答案 5 :(得分:-1)

您了解您在做什么吗?您正在创建一个数组,然后通过将与第一个相同的单个指针分配给第二个数组的元素来填充第二个数组。这里没有循环引用,但没有任何“复制”。

外观:按照您说的做之后,您可以更改初始的numbers数组,并且更改会反映在numbersCopy的每个成员中。 h都是相同的numbers数组,显然它们都改变了。

您实际上想做什么?

您在哪里做的不是您的期望?