JS-用于循环推送数组

时间:2018-08-01 23:16:51

标签: javascript arrays loops for-loop

我有一个初始数组

我一直试图通过在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

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,以提高您的知识,从而就使用各种选项做出最佳决定。