使用另一个数组搜索多维数组(Flash As3)以获取搜索条件

时间:2011-09-26 21:14:48

标签: arrays flash actionscript-3 search multidimensional-array

长话短说:我想在AS3中搜索多维数组(在本例中)6个字符串的位置 - 所有这些都存储在另一个未填充的数组中。

长篇故事:

一旦我得到每个字符串的位置(在多维数组中),然后我知道它所在的位置,并且可以访问该对象的其他属性 - 所以如果我发现字符串“box3”位于元素[5]中我的多维数组,我现在可以定位:

multiArray [5] [3]返回存储的第4项(记住我们从0开始,所以3是第4位)。

我可以让它工作一次,但我正在尝试根据我的基本字符串存储数组的长度设置一个for循环 - 这个数组保存(在这个例子中)6个实例名称字符串 - 每次我的for循环循环,我需要在我的多维数组中为下一个连续的实例名称运行搜索。

然后,一旦我找到所有这些(并将结果存储在一个新的临时数组中),我可以在每个位置挖掘我需要的信息。

我唯一能找到的就是这里的帖子:

http://exoboy.wordpress.com/2010/07/15/successfully-searching-multidimensional-arrays-in-as3/

如果我只在我的数组中搜索一个元素,那么它的工作原理很棒 - 但是当我需要在for循环中使用它们的代码找到多个元素时它会崩溃。您可以在该页面上查看我的问题/他们的回复以及更多信息。

我最终需要一个简单的运行函数,可以反复使用,因为我将在该数组中进行大量搜索,以便进行模拟。感谢大家, -Eric

3 个答案:

答案 0 :(得分:0)

我猜你需要两个for循环。

使用一个循环在数组中搜索(这是你已经拥有的循环代码),并将其包装在执行该搜索循环的另一个for循环中。

有道理吗?

答案 1 :(得分:0)

这是您可以使用的基本功能。

显然,您需要循环调用此函数进行测试的所有数组。

function arrayContains( haystack:Array, needle:String ):Boolean{
  for( var i:Number = 0;i < haystack.length; i++ ) {
    if( needle == haystack[i] ) {
      return true;
    }
  }
  return false;
}


// sample code
var myArray:Array = new Array();
myArray.push(["granola","people... are great"," 4 ","10"]);
myArray.push(["bill","orangutan","buster","keaton"]);
myArray.push(["steve","gates","24","yes, sometimes"]);
myArray.push(["help","dave","jobs","hal"]);

var searchArray:Array = ["granola","orangutan","24","hal"];

for each( var arr:Array in myArray ){
  for each( var searchString:String in searchArray ){
    if( arrayContains( arr, searchString ) ){
      trace( 'found ' + searchString + 'in myArray at ' + myArray.indexOf(arr)  )
    }
  }
}

答案 2 :(得分:0)

此版本使用方法本身循环searchArray(),并跟踪树中的位置。找到匹配后,它会将位置输出到searchResults。然后,您可以对每个uints数组使用getNestedItem()来检索值。

package  
{
    import flash.utils.getQualifiedClassName;

    public class NestedSearch 
    {
        private var _multidimensionalArray :Array = 
            [
                //[0]
                [
                    // [0]
                    // [0],  [1],    [2]
                    ["one", "two", "three" ], 
                    // [1]
                    // [0],  [1],    [2]
                    ["eleven", "twelve", "thirteen" ] 
                ],
                //[1]
                [
                    // [0]
                    // [0],  [1],    [2]
                    ["hyena", "iguana", "jackal" ], 
                    // [1]
                    "koala"
                ]
            ];

        private var queries :Array = new Array( "three", "twelve", "hyena", "koala" );

        private var searchResults :Array = [];


        public function NestedSearch() 
        {
            // Make multiple queries
            for ( var q in queries)
            {
                searchArray( queries[ q ], _multidimensionalArray, [] );
            }           

            // Use the results
            for ( var i in searchResults )
            {
                trace( 'Found "' + searchResults[ i ].query + 
                      '" at _multidimensionalArray[' + searchResults[ i ].position + ']');  
                trace( "Test value: " + getNestedItem( _multidimensionalArray, searchResults[ i ].position ));
            }
        }

        // Searches any array for an exact String value. 
        // Returns the found string as an Array of uints representing its position in the tree.
        public function searchArray ( s:String, a:Array, positionPath:Array )
        {
            // Duplicate array to save it before going back out
            var _origPosPath = positionPath.concat();   

            for ( var i in a )
            {
                if ( getQualifiedClassName( a[ i ] ) === "Array")
                {
                    positionPath.push(i);
                    searchArray( s, a[ i ], positionPath );
                    positionPath = _origPosPath;
                }
                else
                {
                    if ( a[ i ] === s)
                        searchResults.push( {query: s, position: positionPath.concat( i )} );
                }
            }
        }

        private function getNestedItem ( arr:Array, pos:Array ) :*
        {
            var nestedItem;
            var p = pos.shift();
            if ( pos.length === 0 )
            {
                nestedItem = arr[ p ];
            }
            else 
            {
                nestedItem = getNestedItem( arr[ p ], pos );
            }
            return nestedItem;      
        }

    }
}