【问题标题】:Efficient way to search for an element in an array based on its property?根据属性在数组中搜索元素的有效方法?
【发布时间】:2016-04-06 14:16:27
【问题描述】:

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

abc 中,恰好有两个将foo 属性设置为true

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

为了说明这一点,我有一个函数,我想根据将 foo 设置为 false 的变量来做一些事情,我不确定确定 @ 的最佳方法是什么987654334@变量是。

例如我可以像这样手动检查使用 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 在运行时放入一个数组中,因此我无法以编程方式确切地知道哪个是哪个,但我可以将它们作为参数传递给函数( s)。

知道了这一点,我还可以使用 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...
    }

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

感谢阅读。

【问题讨论】:

    标签: arrays actionscript-3 search


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      如果您只希望数组中的第一项具有 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;
      

      【讨论】:

      • 那么...既然您已将我的所有代码都编辑到您的答案中,我应该删除我的答案吗? :)
      • 搞笑,我正要说你的答案时。
      • This editthis edit 在我用几乎相同的代码回答之后......但无论如何,也许只是巧合,这肯定不是一个新颖的解决方案。
      • 无论如何我都赞成你的答案,因为它涵盖了更多,干杯。 :)
      • 如果您查看时间戳,第一个链接编辑(编辑 3)是在您回答之前 10 分钟。无论如何,我回滚了我在您回答后所做的后期编辑,因为它确实非常相似和多余。
      猜你喜欢
      • 2022-12-04
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 2021-10-08
      • 2013-08-07
      • 2022-08-02
      • 1970-01-01
      相关资源
      最近更新 更多