2011-12-13 34 views
0

我正在努力应对不应该太困难的事情,但我无法弄清楚我有一些具有不同值的数组,我想找到所有常见值数组有,见下面的例子:AS3在数组中找到常用值

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

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

任何帮助表示赞赏。

回答

3

你可以这样做:

///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); 
+0

感谢您的帮助,是否有一种简单的方法来修改函数来接受任意数量的数组而不是指定的数量。 – redHouse71

+0

感谢这很好,但如果你有相同的值的倍数呢? var arr1:Array = [“1”,“1”,“1”,“1”,“one”,“two”,“three”,“four”,“five”];值“1”确实计算结果? – sputn1k

+1

@ v1ru2 as-is代码会在两个数组都有它的情况下添加“1”,但是如果您不希望有重复的“1”值的机会,则可以在调用'1“之前轻松检查该值是否已存在于'toReturn'中, toReturn.push(array1 [i]);' – ToddBFisher

3

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

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.<String>代替阵列尽可能提高性能,但永远记住,Array.sort()是土生土长的功能和非常快...

+0

非常感谢! – redHouse71

+0

比我的好,+ 1UP – ToddBFisher

2

我会使用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和AR值的数组rayThree。

编辑:这里是将采取任何数量的阵列和返回的共同价值观的功能:

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); 

函数有第一个在另一个内部嵌套关闭,所以可能有点难以理解,但我测试了它,它的工作原理。

+0

哇我不得不看这15分钟才能理解它,非常聪明的解决方案! – redHouse71