我正在做一个小型个人项目,遇到了我不理解的问题,希望有人能向我解释。我的模块中的方法之一是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
答案 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);