Array.push修改现有元素

时间:2018-12-21 14:13:32

标签: javascript arrays

我正在做一个小型个人项目,遇到了我不理解的问题,希望有人能向我解释。我的模块中的方法之一是SaveSet(),它采用一个数组并将其作为元素添加到另一个数组中,因此它成为二维数组,这里是SaveSet()的代码:

function SaveSet() {
    anim.push(set)
}  

当我运行这段代码时,我希望它采用set数组中的任何内容并将其作为这样的元素添加到anim数组中。

Set = [1,2,3,4]
SaveSet()
Set = [3,4,5,6]
SaveSet()

最后我应该得到这样的东西:

[
   [1,2,3,4]
   [3,4,5,6]
]

但是,我的SaveSet()修改了现有的并添加了一个新的,所以我最终得到了这样的东西

[
  [1,2,3,4,3,4,5,6]
  [1,2,3,4,3,4,5,6]
]

通过将SaveSet()更改为此,我找到了解决方法:

function SaveSet() {
    let temp = JSON.stringify(set)
    anim.push(JSON.parse(temp));
}  

但是,我仍然不明白为什么anim.push也要修改现有的。如果有人要看的话,这是完整的代码。正如我所说的,这是一个个人快速项目,因此代码和设计的质量确实很低。  https://codepen.io/anon/pen/oJZeJy?editors=1111

3 个答案:

答案 0 :(得分:4)

您始终对所有数据使用相同的数组。

正在发生的事情是您正在代码中全局初始化set = [] 一次

然后,每次保存集合时,您都将这个数组添加到anim数组中,但是从不更新变量set指向的内容。

因此,您只需不断地添加相同的set数组:

var set = [];
var anim = [];

function addToSet() {
  set.push(String(Math.random()).slice(2,3));
  console.log(set);
}

function saveSet() {
  anim.push(set); // <--- you are always pushing the same array
  console.log(anim);
}
<button id="add" onclick="addToSet()">Add to set</button>
<button id="save" onclick="saveSet()">Save set</button>

每次保存集合时,您应该创建一个新集合:

function saveSet() {
  anim.push(set);
  set = []; // <---- reset the set to a new array
}

答案 1 :(得分:0)

通过使用.push方法,您正在将指针推入数组。 如果您将代码更改为

function SaveSet() {
    anim.push([...set])
}  

它将创建一个新数组,散布set中的当前元素并将其推送到动画。

您的集合数组可能由于代码另一部分的错误而更改。与这里无关

答案 2 :(得分:0)

您应该执行以下操作:

var anim = []
function SaveSet(set){
  anim.push(set);
}
var set = [1,2,3,4];
SaveSet(set);
set = [3,4,5,6];
SaveSet(set);