长话短说:我想在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
答案 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;
}
}
}