我正在使用P5.js,并尝试将一些值保存在一个数组中,然后创建该数组的副本进行操作。不幸的是,当我操作第二个数组时,原来的数组也发生了变化,我不知道为什么。
var particels = []
var particelsCopy = []
function calcInitialPositions(){
for (var i = 0; i < pixels.length; i+=4) {
if (pixels[i] == 0){
var x_ = i % width
var y_ = i / width / 2
var coords_ = {x : x_ , y : y_}
particels.push(coords_)
}
};
}
function setup() {
loadPixels()
calcInitialPositions();
particelsCopy = particels
}
function draw() {
for (var i = 0; i < particelsCopy.length; i++) {
particelsCopy[0].x = 99
};
console.log(particel[0].x)
}
控制台打印99
发布于 2018-07-01 08:51:38
Javascript中的=
操作符通过引用而不是值来分配对象,其中包括数组。所以这句话:
particelsCopy = particels
正在将particelsCopy
重新定义为particels
的别名...在这之后,它们是相同的数组。您需要按值复制数组,如下所示:
particelsCopy = particels.slice();
注意:这只是一个浅层复制,如果数组包含对象或数组,它们将通过引用复制,您将不得不在子项上重复此操作(例如,coords_
对象,尽管对于对象,模式是copy = Object.assign({},original);
)。
要按值深度复制所有内容,您必须对对象/数组的每个子级执行此操作。许多像jQuery这样的库都有现成的函数来帮助实现这一点。
发布于 2018-07-01 08:53:16
这行代码:
particelsCopy = particels
复制数组引用,而不是数组中的元素。
您需要分配一个新的数组对象,然后复制元素。如果元素是对象,则还必须对它们进行浅(或深)复制。此解决方案使用Object.assign()进行浅层复制。
particelsCopy = [] // already done previously
for (var i=0; i<particels.length; i++){
particelsCopy[i] = Object.assign({}, particels[i]};
}
发布于 2018-07-01 08:53:40
您可以使用解构来复制数组中的对象
particelsCopy = particels.map(obj => ({...obj}));
https://stackoverflow.com/questions/51119591
复制相似问题