2011-12-13 66 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