如何将一个变量多次推入数组而不改变它?

How do you push a variable into an array multiple times without it changing?

我正在尝试将一些值推送到一个名为“Brain.js”的数组中。当将变量存储在数组中并稍后更改它时,存储在数组中的所有变量都会更改。有人可以帮助我做到这一点,这样他们就不会改变吗?我遇到了很多麻烦。

这是一个例子:

var hold = ([

]);
var a = [1, 1, 1]
var b = [2];

hold.push(
    { input: a, output: b }
);

console.log(hold); // returns [ { input: [ 1, 1, 1 ], output: [ 2 ] } ]

a[2] = 2;
b = [3];

hold.push(
  { input: a, output: b }
);

console.log(hold);
// Expected output: [ { input: [ 1, 1, 1 ], output: [ 2 ] }, { input: [ 1, 1, 2 ], output: [ 3 ] } ]
// What it really returns: [ { input: [ 1, 1, 2 ], output: [ 2 ] }, { input: [ 1, 1, 2 ], output: [ 3 ] } ]

问题是您正在更新现有数组 a,该数组已在您推送的第一个对象中被引用。如果您不想修改现有数组,您应该创建一个副本

var hold = ([

]);
var a = [1, 1, 1]
var b = [2];

hold.push({
  input: a,
  output: b
});

console.log(hold);

a = [...a]; // create a new copy of a
a[2] = 2;
b = [3];

hold.push({
  input: a,
  output: b
});

console.log(hold);

问题是,您没有将实际数字推入数组,而是引用。换句话说,您传递了两次对同一对象的引用。

您可以做的是在将对象传递给 hold 时创建对象的副本。你可以使用例如。传播运算符。

hold.push(
    { 
        input: ...a, 
        output: ...b
    }
);

你可以在这里找到更多 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax