Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS-For循环推送数组_Javascript_Arrays_Loops_For Loop - Fatal编程技术网

Javascript JS-For循环推送数组

Javascript JS-For循环推送数组,javascript,arrays,loops,for-loop,Javascript,Arrays,Loops,For Loop,我有一个初始数组 我一直试图在for循环中使用pop、splice方法来更改值(顺序),最后我将此数组推送到容器数组。 但是,每次初始化数组时,都会推送值。当我在push方法之前编写console.log(initial)时,我可以看到初始数组已经更改,但它没有被推送到容器中 我还尝试通过使用settimeout for push方法来减慢进程,但这不起作用。它并没有放缓。我猜这段代码会立即被调用 我想知道这里发生了什么?为什么我会有这样的问题,解决方法是什么 function trial(){

我有一个初始数组

我一直试图在for循环中使用popsplice方法来更改值(顺序),最后我将此数组推送到容器数组。 但是,每次初始化数组时,都会推送值。当我在push方法之前编写console.log(initial)时,我可以看到初始数组已经更改,但它没有被推送到容器中

我还尝试通过使用settimeout for 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
function-trial(){
设schedulePattern=[];
设initial=[1,3,4,2];
for(设i=0;i<3;i++){
设temp=initial.pop();
初始拼接(1,0,温度);
控制台日志(首字母);
schedulePattern.push(初始);
}
返回调度模式;
}
**Console.log**
(4) [1, 2, 3, 4] 
(4) [1, 4, 2, 3] 
(4) [1, 3, 4, 2] 
(3) [阵列(4)、阵列(4)、阵列(4)]
0 : (4) [1, 3, 4, 2] 
1 : (4) [1, 3, 4, 2] 
2 : (4) [1, 3, 4, 2] 
长度:3

当您将
initial
推入
schedulePattern
时,它将是对同一数组对象的一组引用。如果要保留阵列的当前内容,可以推送阵列的副本:

schedulePattern.push(initial.slice(0));

这里关于引用类型与值类型的回答很好:

当您将数组推到schedulepattern时,您正在向它传递一个引用。 您必须“克隆”阵列

使用slice函数

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.slice());
    }
    return schedulePattern;
}
​
function-trial(){
设schedulePattern=[];
设initial=[1,3,4,2];
for(设i=0;i<3;i++){
设temp=initial.pop();
初始拼接(1,0,温度);
控制台日志(首字母);
schedulePattern.push(initial.slice());
}
返回调度模式;
}
​

您必须知道数组是可变对象。这是什么意思?它意味着发生在您身上的事情,您正在复制对象的引用并对其进行修改

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]

我鼓励您查看一下,以增加您的知识,从而在使用不同选项时做出最佳决策。

splice
是错误的方法<代码>[6,2,7,2,3].splice()变为
[]
<代码>.slice是您想要的。