0

我正在尝试将一些值推送到一个名为“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 ] } ]

4

2 回答 2

0

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);

于 2020-10-13T18:52:25.847 回答
0

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

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

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

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

于 2020-10-13T18:56:41.160 回答