我有一个初始数组
我一直试图通过在for循环中使用 pop , splice 方法来更改值(顺序),最后将这个数组推到容器数组中。 但是,每次初始数组被压入值时。当我在push方法之前编写console.log(initial)时,可以看到初始数组已更改,但未将其推送到容器。
我还尝试通过将settimeout用于push方法来减慢该过程,但这没有用。它并没有放慢速度。我想这段代码会立即被调用
我想了解这里发生了什么?为什么会有这种问题,解决该问题的解决方案是什么?
function trial(){
let schedulePattern = [];
let initial = [1,3,4,2];
for(let i = 0; i < 3; i++){
let temp = initial.pop();
initial.splice(1,0,temp);
console.log(initial);
schedulePattern.push(initial);
}
return schedulePattern;
}
**Console.log**
(4) [1, 2, 3, 4]
(4) [1, 4, 2, 3]
(4) [1, 3, 4, 2]
(3) [Array(4), Array(4), Array(4)]
0 : (4) [1, 3, 4, 2]
1 : (4) [1, 3, 4, 2]
2 : (4) [1, 3, 4, 2]
length : 3
答案 0 :(得分:0)
当您将initial
推入schedulePattern
时,将是对同一Array对象的一堆引用。如果要保留其当前内容,则可以推送数组的副本:
schedulePattern.push(initial.slice(0));
有关引用类型和值类型的良好答案,请点击此处:https://stackoverflow.com/a/13266769/119549
答案 1 :(得分:0)
当您将数组推到 schedulepattern 时,您正在传递对其的引用。 您必须“克隆”数组。
使用切片功能。
-ab
答案 2 :(得分:0)
您必须知道数组是可变对象。这是什么意思?这意味着您正在发生什么,您正在复制对象的引用并对其进行修改。
const array = [1,2,3]
const copy = array;
copy.push(4);
console.log(array); // [1, 2, 3, 4]
console.log(copy); // [1, 2, 3, 4]
Javascript中有很多方法可以为您提供所需的方法。换句话说,创建一个新的阵列副本即可正常工作而无需修改根目录。
const array = [1,2,3]
const copy = Array.from(array);
copy.push(4);
console.log(array); // [1, 2, 3]
console.log(copy); // [1, 2, 3, 4]
我鼓励您查看Array methods,以提高您的知识,从而就使用各种选项做出最佳决定。