如何使用一个对象的值来编辑另一个对象的值?

时间:2014-10-11 09:20:24

标签: javascript object

布局/格式说明:

在我编码的游戏中,有不同的资源。升级到项目会花费不同数量的这些资源,尽管大多数只需要2或3种资源类型。由于数百种资源类型中的每一种都有多个参数(数量,风味文本等),我认为通过对象创建与这些资源相关的数据是最明智的。我最终决定的布局如下($表示根游戏对象):

$.resources.genericResource = {

    resource1: {

        amount: 0,
        earnt: 0,
        flavourText: "Generic flavour text"

    }
    resource2: {

        amount: 0,
        earnt: 0,
        flavourText: "Not generic flavour text"

    }
    resource42: {

        amount: 0,
        earnt: 0,
        flavourText: "The answer to life, the Universe, and everything" //Possibly...

    }

}

每个资源都有一个amount整数变量,(顾名思义)表示当前拥有的每种资源的数量。

每个可购买的项目(升级,建筑等)都有许多资源(以及其他一些东西)的基本成本。如此,这也通过一个对象表示:

$.upgrades.genericUpgrade.baseCost = {

    resource1: 7,
    resource2: 1,
    resource42: Math.PI

}

请注意,这些内容的初始化时间比此处详述的更为明智 - 这只是显示将要使用的格式的示例。

布局/格式要求的原因:

现在,这些需要是对象而不是数组,因为每个资源都有额外的数据 - 游戏将继续使用新资源进行更新(因此索引编辑可能会出现保存文件问题) 。但是,对于包含每个资源的键的每个可购买项目(其值大多为零)而不是baseCost,我只想让它只包含不同于零的值。这将大大增加整洁度,易于更新,文件大小和我的理智到最后。

我的问题:

非常简单:我完全不知道如何创建一个循环,在给定baseCost对象的情况下,返回相关$.resources对象的值,因为对象与数组不同,是不可索引的。我还需要在成功购买后编辑$.resources值,但考虑到相关键的名称会更容易,作为一个简单的for循环

$.resources[resource].amount -= cost;

每个资源。

TL; DR:我不知道如何根据其中一个的密钥名称迭代两个单独的对象。

我自己可能的解决方案(或尝试/开始):

在进一步讨论之前,我将首先制作一些辅助变量来引用baseCost$.resources对象,因为这将大大减少代码长度(在实际代码中,前者会仅引用$.upgrades对象):

var $u = $.upgrades.genericUpgrade.baseCost;
var $r = $.resources;

我首先考虑了如何获得输入 - 首先需要确定$.upgrades.genericUpgrade.baseCost的密钥数量。足够简单 - 只需做类似以下的事情:

var keys = Object.keys($u);
var keyQuantity = keys.length;

前面的代码片段包含另一个有用的变量:一个包含键名作为字符串的数组。这对最终替换很有用,但首先我们需要一个for循环,在其中可以找到购买的有效性(也就是说,是否太昂贵):

var keysIndex;
for (i = 0; i < keyQuantity; i++) {

    keysIndex = keys[i];

    //Is the resource cost greater than the amount of the resource owned?
    if ($u[keysIndex] > $r[keysIndex]) { 

        //Code to either break out of the loop, return false, or something similar

    }

}

这几乎已经完成了:现在所需要的只是在物品不太贵的情况下否定成本,并将所有代码放在一起。然后我们得到以下内容:

function purchaseUpgrade(upgrade) {

    var $u = $.upgrades[upgrade].baseCost;
    var $r = $.resources;

    var keys = Object.keys($u);
    var keyQuantity = keys.length;

    //Helper variable to assist with key referencing:
    var keysIndex;

    //Boolean to decide whether or not a purchase is valid
    var isValid = true;

    //Check for all resources in $u:
    for (i = 0; i < keyQuantity; i++) {

        keysIndex = keys[i];

        //Is the resource cost greater than the amount of the resource owned?
        if ($u[keysIndex] > $r[keysIndex].amount) { 

            //Invalidate the purchase
            isValid = false;

            //As no more permutations are necessary, break the loop:
            break;

        }

    }

    //If all resource costs are lesser than the owned resources, do the following:
    if (isValid === true) {

        for (i = 0; i < keyQuantity; i++) {

            keysIndex = keys[i];
            $r[keysIndex].amount -= $u[keysIndex];

        }

        $.upgrades[upgrade].owned += 1;

    }

}

该功能可由purchaseUpgrade("nameOfUpgrade")调用。

结束

我现在意识到我在写出来的时候已经解决了这个问题......但是,由于StackOverflow上没有明显的类似问题,我仍然决定发布这个问题,因为它可能会对某些人有用。点。但是,如果有人认为他们有更好/更有效的答案,请随意发布 - 在这种情况下,我会选择它作为最佳答案&#39;。

0 个答案:

没有答案