基于其属性搜索数组中元素的有效方法吗?

时间:2016-04-06 14:16:28

标签: arrays actionscript-3 search

我有三个变量,abc。这些变量中的每一个都具有属性foo,如果它是Boolean

abc之外,其中只有两个人将foo属性设置为true

找出哪一项设置为false的最有效方法是什么?

为了把它放到上下文中,我有一个函数,我想根据哪个变量foo设置为false来做一些事情,我不知道什么是最好的如何确定false变量是什么。

E.g。我可以使用if语句手动检查:

function doThings():void
    {
        if (a.foo == true)
        {
            if (b.foo == true)
            {
                True = a;
                True2 = b;
                False = c;
            }
            else
            {
                True = a;
                True2 = c;
                False = b;
            }
        }
        else
        {
            True = b;
            True2 = c;
            False = a;
        }

        //More things...
    }

或者我想到的另一种方法是将我知道foo设置为true的两个变量作为函数的参数传递,然后执行此操作:

function doThings(para, para2):void
    {
        if (a != para && a != para2)
        {
            False = a;
        }
        else if (b != para && b != para2)
        {
            False = b;
        }
        else
        {
            False = c;
        }

        //More things...
    }

旁注:foo设置为true的两个在运行时被push编入数组,所以我无法准确地告诉哪一个是哪个编程,但是我可以通过它们作为函数的参数。

知道了这一点,我也可以使用indexOf轻松检查数组中的哪一个,但该方法的基本原理仍然保持不变。

这可以这样做,不使用参数:

function doThings():void
    {
        if (TrueArray.indexOf(a) == -1)
        {
            False = a;
            True = b;
            True2 = c;
        }
        else if (TrueArray.indexOf(b) == -1)
        {
            False = b;
            True = c;
            True2 = a;
        }
        else
        {
            False = c;
            True = a;
            True2 = b;
        }

        //More things...
    }

目前看来,第二种方法看起来更吸引人,而且似乎最简单,但我只是想知道是否有更复杂的方法来做到这一点。

感谢阅读。

2 个答案:

答案 0 :(得分:1)

如果您只想要数组中的第一项foo值为false,那么最有效的方法可能是简单的for循环。这也会自动扩展到数组中的任意数量的项目(而不是硬编码为3个项目)

//assumes you have an array of objects called 'myArray'

function getFirstFalseFoo():Object {
    //iterate over every item in 'myArray'
    for(var i:int = 0, len:int = myArray.length; i < len; i++){
        //if the array item's foo value is false, return that object (thus exiting the loop)
        if(!myArray[i].foo){
            return myArray[i];
        }
    }
}

var myFalseFoo:Object = getFirstFalseFoo();


//OR, you could pass in objects as parameters to the function like this:
function getFirstFalseFoo(... args):Object {
    //iterate over every item passed to the function
    for(var i:int = 0, len:int = args.length; i < len; i++){
        //if the item has a foo property and it's false, return that object (thus exiting the loop)
        if(args[i].hasOwnProperty("foo") && !args[i].foo){
            return args[i];
        }
    }
}

var myFalseFoo:Object = getFirstFalseFoo(a, b, c);  //you could pass as many objects as you want

当然有很多方法可以实现这一目标,最“高效”可能取决于很多因素,并且取决于您对效率的定义(计算速度最快,代码量最少,可扩展性最好等)。

另外,AS3(以及许多其他语言)中的最佳实践是变量,函数名称以小写字母开头。最好不要让变量名匹配语言关键字。我建议将变量更改为这些行中的变量,以便于阅读和理解:

var falseObj:Object;
var trueObj:Object;
var true2Obj:Object;

答案 1 :(得分:1)

我说你的第二个选择是正确的方向。我可能会这样实现它:

function findFalseFoo(...objects:Array):Object {
    for each (var object:Object in objects) {
        if (object.foo == false)
            return object;
    }
}

function doStuff():void {
    var falseFoo:Object = findFalseFoo(a, b, c);
    switch (falseFoo) {
        case a:
            // do stuff
            break;
        case b:
            // do stuff
            break;
        case c:
            // do stuff
            break;
    }
}

当然,在您发布的每个案例中,您发布的所有内容都在设置FalseTrueTrue2属性。在这种情况下,您可以这样做:

function assignTrueFalse(...objects:Array):void {
    False = True = True1 = null;
    for each (var object:Object in objects) {
        if (object.foo) {
            if (True == null) 
                True = object;
            else
                True2 = object;
        } else {
            False = object;
        }
    }
}

assignTrueFalse(a, b, c);