Arrays AS3在数组中查找公共值
我正在努力解决一些不太难解决的问题,但我想不出来我有许多不同值的数组,我想找到所有数组的公共值,请参见下面的示例:Arrays AS3在数组中查找公共值,arrays,flash,actionscript-3,Arrays,Flash,Actionscript 3,我正在努力解决一些不太难解决的问题,但我想不出来我有许多不同值的数组,我想找到所有数组的公共值,请参见下面的示例: var arrayOne:Array = ["1","2","3"]; var arrayTwo:Array = ["1","2","7"]; var arrayThree:Array = ["1","2","9","12"]; _resultArray = ["1","2"]; 非常感谢
var arrayOne:Array = ["1","2","3"];
var arrayTwo:Array = ["1","2","7"];
var arrayThree:Array = ["1","2","9","12"];
_resultArray = ["1","2"];
非常感谢您的帮助。您可以采取以下措施:
///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);
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);
或者,您可以修改该函数以将所有三个数组都包含在比较中,这样会更有效
编辑
如果要处理未知数量的阵列,可以添加:
///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 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。尽可能使用Array.sort代替Array来提高性能,但请始终记住Array.sort是一个本机函数,速度非常快……我将使用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和ArrayTree中
编辑:下面是一个函数,它将接受任意数量的数组并返回公共值:
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);
该函数在第一个闭包中有另一个嵌套闭包,因此可能有点难以理解,但我测试了它,它可以工作。感谢您的帮助,是否有一种简单的方法可以修改该函数以接受任意数量的数组而不是指定数量的数组。谢谢,这很好,但是如果有相同值的倍数,该怎么办?var arr1:Array=[1,1,1,1,1,2,3,4,5];值1是否计入结果?@v1ru2如果两个数组都有,代码会添加1,但如果您不希望有重复1值的机会,则可以在调用toReturn.pusharray1[i]之前轻松检查toReturn中是否已经存在该值@ToddBFisher感谢您将尝试此方法,但不确定我是否能够使其正常工作,我在此处添加了一个问题-@ToddBFisher我希望arr1中的重复数组值1被计数而不被忽略?哇,我必须看15分钟才能理解它,非常聪明的解决方案!