2010-07-14 72 views

回答

3

這裏是一個小功能,我寫了,而以前,偉大工程。我包含了很多評論和一個示例搜索/函數來輸出結果。

// set up a multidimensional array that contains some data 
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"]); 

// here we set up some properties on the array object to hold our search string and our results 
myArray.myTarget = "steve"; 
myArray.myResults = []; 

// now we call the search 
myArray.forEach(multiSearch); 

// this is the function that does all the heavy lifting.... 
function multiSearch(element:*, index:int, array:Array) 
{ 
    // see if we have a match in this array and pass back its index 
    for(var i:* in element) 
    { 
     if(element[i].indexOf(array.myTarget) > -1) 
     { 
      var tempArray:Array = array.myResults; 
      tempArray.push([index,i]); 
      array.myResults = tempArray; 
     } 
    } 
} 

// ------------------------------------------------------------------------------- 
// all the code below is OPTIONAL... it is just to show our results 
// in the output window in Flash so you know it worked.... 
var printArray:Array = myArray.myResults; 
for(var i:* in printArray) 
{ 
    trace("TARGET FOUND @: "+printArray[i][0]+", "+printArray[i][1]+" = "+myArray[ printArray[i][0] ][ printArray[i][1] ]); 
} 
// ------------------------------------------------------------------------------- 
+0

這是裸機版本(你需要做它的工作,除了你的數組索引內容的唯一的東西): \t VAR myArray的:數組= new Array(); \t myArray.myTarget =「steve」; \t myArray.myResults = []; \t \t myArray.forEach(multiSearch); \t \t功能multiSearch(元素:*,索引:INT,數組:陣列) \t { \t \t爲(VAR I:*在元件) \t \t {\t \t \t \t如果(元素[I]。的indexOf(array.myTarget)> -1) \t \t \t { \t \t \t \t VAR tempArray:數組= array.myResults; \t \t \t \t tempArray.push([index,i]); \t \t \t \t array.myResults = tempArray; \t \t \t} \t \t} \t} – exoboy 2010-07-15 00:24:50

+0

感謝。我剛剛添加了一個小小的新函數(asdf.find = function(){}),它受你的解決方案的啓發。 – embassyhill 2010-07-15 08:44:56

+0

太棒了!總是能夠解釋人們需要的東西是很困難的...所以當解決方案有幫助時我總是很開心! – exoboy 2010-07-15 15:28:39

0

這個工程。可能是因爲內部數組是鍵入的。

var qwer:Array = [1,1]; 
var asdf:Array = [qwer]; 
trace(asdf.indexOf(qwer)); // 0 
+0

不,它suceeds因爲QWER僅僅是一個數組引用 – Patrick 2010-07-14 19:57:49

1

它失敗,因爲當你做一個[x,y]要創建一個新的數組,adsf包含一個陣列和indexOf尋找另外一個。

嘗試:

trace([1,1] == [1,1]); 

你會看到,它打印錯誤,因爲數組作爲參考比較。

一個快速的indexOf功能,安排,以滿足您的需求:

function isElmEquals(e1:*, e2:*):Boolean { 
    return (e1==e2); 
} 

function isArrayEquals(a1:Array, a2:Array):Boolean { 
    if (a1==a2) 
     return true; 

    if ((a1==null) || (a2==null)) { 
     return false; 
    } 

    if (a1.length!=a2.length) 
     return false; 

    for (var i:int=0;i<a1.length;i++){ 
     if (!isElmEquals(a1[i], a2[i])) 
      return false; 
    } 

    return true; 
} 

function indexOf(value:Array, into:Array):int{ 
    var i:int = -1; 
    into.some(
     function(item:*, index:int, array:Array):Boolean { 
      if (isArrayEquals(item as Array, value)) { 
       i = index; 
       return true; 
      } 
      return false; 
     } 
    ); 
    return i; 
} 

var i:int=indexOf([1,1], [[-1,1], [0,1], [1,1], [1,-1]]); 
trace(i); 

var j:int=indexOf([1,2], [[-1,1], [0,1], [1,1], [1,-1]]); 
trace(j);