停止对象共享值



要设置此项,我创建2个震源组对象,将它们存储在一个数组中,然后将数组打印到控制台。这是我在创建两个舰队对象后得到的结果。

[
{ number: 1, activities: [], addActivity: [Function (anonymous)] },
{ number: 2, activities: [], addActivity: [Function (anonymous)] } 
]

震源组对象的addActivity函数将一个活动添加到指定对象的活动数组中。这就是函数。

fleet.addActivity = function(activity) {
this.activities.push(activity);
}

但是,每当我使用此函数时,它都会更改阵列中的两个震源组对象,使它们的编号与我指定的编号相同。例如,

const fleet = Fleet.getFleet(1);
fleet.addActivity('Run');

这是在控制台中打印的:

[
{
number: 1,
activities: [ 'Run' ],
addActivity: [Function (anonymous)]
},
{ number: 1, activities: [], addActivity: [Function (anonymous)] }
]

如果我再次使用

const fleet = Fleet.getFleet(2);
fleet.addActivity('Walk');

控制台将打印:

[
{
number: 2,
activities: [ 'Walk', 'Run' ],
addActivity: [Function (anonymous)]
},
{ number: 2, activities: [], addActivity: [Function (anonymous)] }
]

有人知道如何解决这个问题吗?

EDIT-这里是getFleet函数:

function getFleet(fleetNumber) {
let result = exports.fleets.filter(function (e) {
return e.number = fleetNumber;
});
return result[0];
}

我也尝试过lodash深度克隆方法,但我仍然有同样的问题。这就是我的addFleet函数当前的样子。我以前创建舰队的方法已经被评论掉了。

function addFleet(number) {
/*let fleet = {
number: number,
activities: []
};
fleet.addActivity = function(activity) {
this.activities.push(activity);
}*/
const deepClone = lodash.cloneDeep(originalFleet);
deepClone.number = number;
exports.fleets.push(deepClone);
exports.fleetAmount += 1;
exports.currentFleets.push(number);
}

您的问题在getFleet()函数内部。您实际上是在覆盖变量,而不是检查每个对象编号是否相等。解决方法很简单,只需将一个等号更改为三。

function getFleet(fleetNumber) {
let result = exports.fleets.filter(function (e) {
return e.number === fleetNumber; // check for equality instead of overwriting
});
return result[0];
}

此外,您使函数过于复杂。由于您只需要找到第一个匹配项,因此应该使用Array.prototype.find()

function getFleet(fleetNumber) {
return exports.fleets.find((e) => e.number === fleetNumber)
}

最新更新