JavaScript创建新对象

时间:2015-02-09 14:35:32

标签: javascript object

目前,我试图让两个拍卖实例同时运行,但似乎在我创建一个新对象时,它与之前的对象完全相同。

代码:

以下是创建新对象的代码:

AuctionSell._state = new auctionGen();
AuctionSell._state.init(i);
auctions.push(AuctionSell._state);

要注意,auctionGen()是一个函数,它返回一个包含拍卖本身所有变量和逻辑的对象。

function auctionGen()
{
    return {
        //code
    }
}

^这只是一个空白模板,用于显示如何实际创建对象。

更新拍卖数组:

update : function(dt)
{
    if(auctions.length > 0)
    {
        for(var i = 0; i < auctions.length; ++i)
        {
            if(!auctions[i]._expired)
            {
                auctions[i].update(dt);
            }
            else
            {
                auctions.splice(i, 1);
            }
        }
    }
}

正如您所看到的,我创建了新对象,然后将其推入一个包含我的拍卖的数组中。这种情况发生在拍卖的init函数中,该函数仅在创建新拍卖时被调用。我检查了两个拍卖州的数据,并且它们包含了拍卖的不同车辆,但是看起来好像创建新的拍卖状态会停止拍卖。

实施例

如果我单独进行一次拍卖 - 取决于汽车 - 最终出价将始终高于其实际价值。但是,如果我同时进行这些拍卖,则保证价值不足。

我刚刚同时进行了两次拍卖,第一辆车的价格为$18000,但拍卖以$6370出价结束。第二辆车的价值为$57,000,拍卖以$46428结束。

所有出价均由AI完成,并且它们被编程为始终在高于车辆价值的某个点停止出价。只有在一次运行两个或更多拍卖时才会出现此问题。

问题

还有另一种方法,我应该创建这些对象,使它们成为真正的新对象吗?截至目前,他们似乎互相干扰。

编辑:

将更新调用更改为以下内容后:

update : function(dt)
{
    var i;
    if(auctions.length > 0)
    {
        i = 0;
        while(i < auctions.length)
        {
            if(!auctions[i]._expired)
            {
                auctions[i].update(dt);
                ++i;
            }
            else
            {
                auctions.splice(i, 1);
            }
        }
    }
}

并修复我的ai阵列不再是全球性的,似乎问题现在只发生在第二次车辆拍卖上。 $57,000车辆的出价停在$17,198我的$12,000车停在[{1}}处(预期行为)

2 个答案:

答案 0 :(得分:5)

您的update代码中存在错误:如果删除条目(splice来电),则不希望增加i,这会让您跳过条目 - 假设您有条目012;处理1时,您将其删除;现在,2处的条目位于1,因此如果您增加i,则会跳过它。

相反,如果您没有删除条目,则只需递增i

update : function(dt)
{
    var i;
    if(auctions.length > 0)             // *** There's no reason to do this
    {
        i = 0;                          // *** Change on this line
        while (i < auctions.length)     // *** Change on this line
        {
            if(!auctions[i]._expired)
            {
                auctions[i].update(dt);
                ++i;                    // *** Note we increment `i`
            }
            else
            {
                auctions.splice(i, 1);  // *** Removing, so don't increment `i`
            }
        }
    }
}

答案 1 :(得分:0)

当你走过它时,你不想不小心操纵容器(在这种情况下是阵列)。在C ++中,这将被称为迭代器失效,但这里的想法是相同的:i被弄乱并指向错误的数据。您的splice调用导致您的循环跳过某些条目。