循环中出现无法解释的数组排序

时间:2014-07-07 13:29:05

标签: javascript arrays sorting

我正在开展一个练习项目 - 与Dota相关的迷你游戏。

http://jsfiddle.net/easwee/MwGsd/

你正在组合3种试剂来召唤(调用)一个咒语。

我有一个包含所有可能的法术组合的数组和另一个记录按键的空数组,并将压制的试剂存储在该数组中。 你总是需要3种试剂来制造一个咒语 - 试剂的顺序无关紧要。

到目前为止所有工作都有效,但是一旦我开始将输入试剂数组与拼写列表数组进行比较,我就会遇到问题:

我正在使用以下比较功能:

function compareArrays(arr1, arr2) {
    return arr1.sort().toString() === arr2.toString()
}

我对数组进行排序并在以下函数中进行比较(reagentStack - 包含输入的试剂):

    function updateSpellList(reagentStack){         
        for( var spell in spellList ) {
            var compareStack = reagentStack;
                compareSpell = spellList[spell];

            console.log(spell);
            console.log('compareStack: ' + compareStack + ' / compareSpell: ' + compareSpell + ' / reagentStack: ' + reagentStack); // check this log in fiddle console
            console.log('---');

            if(compareArrays(compareStack, compareSpell)) {
                invokedSpell = spell;                   
                console.log('Invoked spell: ' + invokedSpell);
                break;
            }

        }           
    }

在示例小提琴(here)中,如果按 Q + Q + E + R 你创造了一个法术组合(在这种情况下是冰墙)。

它正在比较所有ok并遵循我的脚本逻辑(将compareStack设置为reagentStack,对compareStackcompareSpell数组进行排序并进行比较),但我不能理解为什么它还要对reagentStack数组进行排序,因为我没有在整个脚本中的任何地方对它进行排序

它没有在for循环的第一次迭代中排序,但是在第二次迭代时得到排序,并且不再正确比较,因为现在compareStack被设置为已排序reagentStack而不是最初输入的。

控制台日志:

coldsnap
compareStack: quas,quas,exort / compareSpell: quas,quas,quas / reagentStack: quas,quas,exort
---
ghostwalk
compareStack: exort,quas,quas / compareSpell: quas,quas,wex / reagentStack: exort,quas,quas

在第一次循环中,试剂堆没有在第二次循环中排序它已经排序 - 为什么?

1 个答案:

答案 0 :(得分:4)

您对有问题的数组进行排序:在此行中,您将创建对该数组的引用:

var compareStack = reagentStack;

然后传递给

if(compareArrays(compareStack, compareSpell)) {

依次排序。 sort()修改它应用的数组,而不像其他一些操作,只返回一个新的修改过的数组。

如果您想要数组的(浅)副本,请使用slice()

var compareStack = reagentStack.slice(0);

Example fiddle