【问题标题】:AS3 Finding common values in ArraysAS3 查找数组中的共同值
【发布时间】:2011-12-13 15:26:45
【问题描述】:

我正在努力解决不应该太困难的事情,但我无法弄清楚我有许多具有不同值的数组,我想找到所有数组的共同值,请参见下面的示例:

        var arrayOne:Array      = ["1","2","3"];
        var arrayTwo:Array      = ["1","2","7"];
        var arrayThree:Array    = ["1","2","9","12"];

        _resultArray = ["1","2"];

感谢任何帮助。

【问题讨论】:

    标签: arrays flash actionscript-3


    【解决方案1】:

    你可以这样做:

    ///Returns common values between to arrays
    function getCommonValues(array1:Array, array2:Array):Array
    {
        var len1:int = array1.length;
        var len2:int = array2.length;
        var toReturn:Array = new Array();
    
        for(var i:int = 0; i < len1; i++){
            for(var n:int = 0; n < len2; n++){
                if(array1[i] == array2[n]){
                    toReturn.push(array1[i]);
                }
            }
        }
        return toReturn;
    }
    

    然后执行以下操作:

    var arrayOneAndTwo:Array = getCommonValues(arrayOne,arrayTwo);
    var _resultArray:Array = getCommonValues(arrayOneAndTwo,arrayThree);
    

    您可以选择修改函数以在比较中包含所有三个数组,这样会更有效。

    编辑

    如果要处理未知数量的数组,可以添加:

    ///Returns common values between X number of sub arrays
    function getCommonValuesFromSubArrays(papaArray:Array):Array
    {
        if(papaArray.length < 2){ return papaArray; }
    
        var toReturn:Array = papaArray[0];
    
        for(var a:int = 1; a < papaArray.length; a++){
            toReturn = getCommonValues(toReturn, papaArray[a]);
        }
    
        return toReturn;
    }
    

    然后是这样的:

    var arr1:Array = ["one","two","three","four","five"];
    var arr2:Array = ["one","two","five","six"];
    var arr3:Array = ["one","two","three","four","five"];
    var arr4:Array = ["one","two","three","four","five"];
    
    var bigOlArray:Array = [arr1,arr2,arr3,arr4];
    
    var _results:Array = getCommonValuesFromSubArrays(bigOlArray);
    

    【讨论】:

    • 感谢您的帮助,有没有一种简单的方法可以修改函数以接受任意数量的数组而不是指定数量。
    • 谢谢,这很好,但是如果你有多个相同的值怎么办? var arr1:Array = ["1","1","1","1","一","二","三","四","五"];值“1”是否计入结果?
    • @v1ru2 假设两个数组都有它,代码将添加“1”,但如果您不希望重复“1”值的机会,您可以轻松检查该值是否已经存在在toReturn 之前调用toReturn.push(array1[i]);
    • @ToddBFisher 谢谢你会试试这个(但不确定我能不能让它工作),我在这里添加了一个问题 - stackoverflow.com/questions/24492636/…
    • @ToddBFisher 我希望不忽略 arr1 中重复的数组值“1”?
    【解决方案2】:

    我将使用一个函数来连接所有数组,按数值排序,并收集与作为参数传入的数组数量完全相同的所有可用项:

    var arrayOne : Array = [ "1", "2", "3" ];
    var arrayTwo : Array = [ "1", "2", "7" ];
    var arrayThree : Array = [ "1", "2", "9", "12" ];
    // you can pass in any number of Arrays
    trace ( searchArraysForCommonItems ( arrayOne, arrayTwo, arrayThree ) ); // returns ["1", "2"]
    
    
    function searchArraysForCommonItems ( ...args : * ) : Array
    {
        var searchArray : Array = [];
        for each ( var arr:Array in args)
            searchArray = searchArray.concat ( arr );
    
        var resultArray : Array = [];
        var last : String;
        var times : int = 0;
        for each ( var str : String in searchArray.sort ( Array.NUMERIC ))
            if (last == str) times++;
            else
            {
                if (times == args.length) resultArray.push ( last );
                last = str;
                times = 1;
            }
    
        return resultArray;
    }
    

    当然,您可以(并且应该)尽可能使用 Vector.&lt;String&gt; 代替 Array 来提高性能,但请始终记住 Array.sort() 是本机函数并且非常快...

    【讨论】:

      【解决方案3】:

      我会使用 Array.filter() 函数来实现:

      var _resultArray:Array = arrayOne.filter(
         function(item:String, index:int, arr:Array):Boolean
         {
            return (arrayTwo.indexOf(item) != -1 && arrayThree.indexOf(item));
         }
      );
      

      这将遍历arrayOne并返回一个数组,其中的值也出现在arrayTwo和arrayThree中。

      编辑:这里有一个函数,它将接受任意数量的数组并返回公共值:

      function getCommonValues(arrayOne:Array, ... arrays:Array):Array
      {
          var _resultArray:Array = arrayOne.filter(
             function(item:String, index:int, arr:Array):Boolean
             {
                return arrays.every(
                  function (a:Array, index2:int, arr2:Array):Boolean
                  {
                      return a.indexOf(item) != -1;
                  }
                );
             }
          );
          return _resultArray;
      }
      

      用法:

      resultArray = getCommonValues(arrayOne, arrayTwo, arrayThree, arrayFour); 
      

      该函数在第一个函数内有另一个嵌套闭包,所以可能有点难以理解,但我测试过,它可以工作。

      【讨论】:

      • 哇,我不得不看这个 15 分钟才能理解它,非常聪明的解决方案!
      猜你喜欢
      • 2023-01-16
      • 2015-10-27
      • 1970-01-01
      • 2015-06-28
      • 2011-04-01
      • 2021-01-30
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多