【问题标题】:JS array, don't push if var = 0JS 数组,如果 var = 0 则不推送
【发布时间】:2020-04-25 14:35:19
【问题描述】:

我正在尝试为游戏“Ogame”制作脚本,我正在寻求有关 javascript 数组的帮助,这不是我的事,我承认。

// Civil ships
    var TransporterSmall = 0; // Petit Transporteur
    var TransporterLarge = 1500; // Grand Transporteur
    var ColonyShip = 0; // Vaisseau de Colonisation
    var Recycler = 0; // Recycleur
    var Probe = 1; // Sonde

// Battle ships
    var FighterLight = 0; // Chasseur Léger
    var FighterHeavy = 0; // Chasseur Lourd
    var Cruiser = 0; // Croiseur
    var Battleship = 0; // Vaisseau de Bataille
    var Interceptor = 0; // Traqueur
    var Bomber = 0; // Bombardier
    var Destroyer = 1; // Destructeur
    var Deathstar = 0; // EDLM
    var Reaper = 1; // Faucheur
    var Explorer = 1; // Eclaireur

这是玩家为每艘船手动设置数字的代码。

然后他有一个按钮,当他点击它时,它会推入一个数组。但我希望如果 var = 0,它不会被推送(非常重要)

document.getElementById('AutoSelect').onclick = function() {
        fleetDispatcher.shipsToSend = []; // Empty array
        fleetDispatcher.shipsToSend.push(
            {id:202,number: TransporterSmall},
            {id:203,number: TransporterLarge},
            {id:208,number: ColonyShip},
            {id:209,number: Recycler},
            {id:210,number: Probe},
            {id:204,number: FighterLight},
            {id:205,number: FighterHeavy},
            {id:206,number: Cruiser},
            {id:207,number: Battleship},
            {id:215,number: Interceptor},
            {id:211,number: Bomber},
            {id:213,number: Destroyer},
            {id:214,number: Deathstar},
            {id:218,number: Reaper},
            {id:219,number: Explorer});
        fleetDispatcher.refresh();
    };

老实说,我不知道该怎么做,我脑子里一片混乱。希望你能帮助我,谢谢!

【问题讨论】:

  • 您必须将船只存储在一个数组(或一个对象)中,而不是从一开始就存储变量。

标签: javascript arrays push


【解决方案1】:

你可以试试三元条件。

如果 TransporterSmall 优于零,则第二部分是一个对象,因此它被推送。如果不优于零,则为 null(不推送任何内容):

document.getElementById('AutoSelect').onclick = function() {
        fleetDispatcher.shipsToSend = []; // Empty array
        fleetDispatcher.shipsToSend.push(

            TransporterSmall > 0 ? {id:202,number: TransporterSmall} : null,
            etc...

        fleetDispatcher.refresh();
    };

【讨论】:

  • 这行不通,至少不像你描述的那样。 null 不会被push 忽略,它会在数组中添加一个null 项。
  • 只需在浏览器控制台中试试这个:a = [1, 2, 3].push(null)。你会发现a的值是[1, 2, 3, null]
  • 是的,不起作用,当我点击按钮时没有任何反应
  • 所以我想使用 && 运算符会完成这项工作,而不是三元:TransporterSmall > 0 && {id:202,number: TransporterSmall}
  • 这只会将额外的0 值推入数组而不是空值。没有任何参数 push 跳过而不向数组添加项目。
【解决方案2】:

您可以使用数组过滤和扩展运算符来完成此操作:

document.getElementById('AutoSelect').onclick = function() {
        fleetDispatcher.shipsToSend = []; // Empty array
        fleetDispatcher.shipsToSend.push(...([
            {id:202,number: TransporterSmall},
            {id:203,number: TransporterLarge},
            {id:208,number: ColonyShip},
            {id:209,number: Recycler},
            {id:210,number: Probe},
            {id:204,number: FighterLight},
            {id:205,number: FighterHeavy},
            {id:206,number: Cruiser},
            {id:207,number: Battleship},
            {id:215,number: Interceptor},
            {id:211,number: Bomber},
            {id:213,number: Destroyer},
            {id:214,number: Deathstar},
            {id:218,number: Reaper},
            {id:219,number: Explorer}]
          .filter(item -> item.number !== 0))
        );
        fleetDispatcher.refresh();
    };

(我还没有彻底检查上面的语法,但至少大致上是这样。)

基本思路是:

  1. 获取一长串项目,然后通过将它们括在方括号中将它们变成一个数组。
  2. 使用filter 清除所有number 为0 的数组项。
  3. 使用展开运算符 (...) 将数组转换回 push 的参数列表,但现在零计数项已消失。

【讨论】:

  • 我正在尝试理解您的代码,我从未使用过数组过滤器,甚至不知道有扩展运算符。我正在同时阅读一些有关它的信息以了解^^'
  • 您也可以跳过展开运算符,使用您最初编写的代码,并在事后清理零计数项,如下所示:fleetDispatcher.shipsToSend = fleetDispatcher.shipsToSend.filter(item -> item.number !== 0)
  • 感谢您的帮助,过滤器帮助了我! :)
  • 请记住选择这个作为您选择的答案,并投票赞成:)
【解决方案3】:

终于成功了。过滤器是关键。感谢您的帮助!

document.getElementById('AutoSelect').onclick = function() {

        let ships = [
            {id:202,number: TransporterSmall},
            {id:203,number: TransporterLarge},
            {id:208,number: ColonyShip},
            {id:209,number: Recycler},
            {id:210,number: Probe},
            {id:204,number: FighterLight},
            {id:205,number: FighterHeavy},
            {id:206,number: Cruiser},
            {id:207,number: Battleship},
            {id:215,number: Interceptor},
            {id:211,number: Bomber},
            {id:213,number: Destroyer},
            {id:214,number: Deathstar},
            {id:218,number: Reaper},
            {id:219,number: Explorer}
        ];

        fleetDispatcher.shipsToSend = []; // Empty array
        fleetDispatcher.shipsToSend = ships.filter(id => id.number > 0);
        fleetDispatcher.refresh();
    };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    相关资源
    最近更新 更多