javascript数组似乎改变了我自己

javascript数组似乎改变了我自己,javascript,arrays,p5.js,Javascript,Arrays,P5.js,我正在使用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

我正在使用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)
}
var particles=[]
var particlescopy=[]
函数CalcinInitialPositions(){
对于(变量i=0;i

Console打印99

Javascript中的
=
操作符通过引用而不是值来分配对象(包括数组)。所以这句话:

particelsCopy = particels
正在将
particlesCopy
重新定义为
particles
的别名。。。。在这一点之后,它们是相同的数组。您需要按如下值复制数组:

particelsCopy = particels.slice();
注意:这只是一个浅拷贝,如果数组包含对象或数组,它们将通过引用进行复制,则必须在子项上重复此操作(例如,
coords\uuuz
对象,但对于对象,模式是
copy=object.assign({},original);

要按值深度复制所有内容,必须对对象/数组的每个子级执行此操作。许多像jQuery这样的库都有现成的函数来帮助实现这一点。

行:

particelsCopy = particels
复制数组引用,而不是数组中的元素

您需要分配一个新的数组对象,然后复制元素。如果元素是对象,则还必须制作它们的浅(或深)副本。此解决方案使用Object.assign()创建浅拷贝

particelsCopy = [] // already done previously
for (var i=0; i<particels.length; i++){
   particelsCopy[i] = Object.assign({}, particels[i]};
}
particelsCopy=[]//前面已经做过

对于(var i=0;i,可以使用解构来复制数组中的对象

particelsCopy = particels.map(obj => ({...obj}));

尝试map或filter…数组喜欢通过引用而不是值传递。通过谷歌搜索“如何复制数组”将为您提供健康的选项和示例代码。我尝试了map和filter方法,但这两个数组仍然保持相同的引用经过几次尝试后,我终于获得了以下结果:
particlescopy=JSON.parse(JSON.stringify(分词);
我发现这个答案很有趣:从@tfmontague我尝试过这个“for循环”解决方案,但不起作用,两个阵列仍然使用相同的reference@ruggero您是否从代码中删除了particleScope=particles行?此外,如果数组中的项是对象,则必须对其进行复制。我将更新答案。