【问题标题】:Stop objects from sharing values阻止对象共享值
【发布时间】:2021-01-27 02:41:43
【问题描述】:

为了进行设置,我创建了 2 个舰队对象,将它们存储在一个数组中,然后将数组打印到控制台。这是我在创建两个舰队对象后得到的。

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

fleet 对象的 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)] }
]

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

编辑- 这是 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);
}

【问题讨论】:

标签: javascript discord.js


【解决方案1】:

您的问题在于您的 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)
}

【讨论】:

    猜你喜欢
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多