var asdf:Array = [ [1,1] ];
trace(asdf.indexOf([1,1])); // -1
Почему indexOf() не может найти массив [1,1]?AS3: индексный массив indexOf() в многомерном массиве
var asdf:Array = [ [1,1] ];
trace(asdf.indexOf([1,1])); // -1
Почему indexOf() не может найти массив [1,1]?AS3: индексный массив indexOf() в многомерном массиве
Вот небольшая функция, которую я написал некоторое время назад, что прекрасно работает. Я включил много комментариев и пример поиска/функции для вывода результатов. не
// 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] ]);
}
// -------------------------------------------------------------------------------
это работает. вероятно, потому, что набирается внутренний массив.
var qwer:Array = [1,1];
var asdf:Array = [qwer];
trace(asdf.indexOf(qwer)); // 0
Нет это suceeds потому Qwer только одна ссылки на массив – Patrick
Это терпит неудачу, потому, когда вы делаете [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);
Это версия скелетных (единственный материал, который Вы должны сделать его работу, для вас содержания индекса массива за исключением): \t вара туАггау: Array = новый массив(); \t myArray.myTarget = "steve"; \t myArray.myResults = []; \t \t myArray.forEach (multiSearch); \t \t функция Multisearch (элемент: *, индекс: INT, массив: Array) \t { \t \t для (вар я: * в элементе) \t \t {\t \t \t \t, если (элемент [I]. IndexOf (array.myTarget)> -1) \t \t \t { \t \t \t \t вар tempArray: Array = array.myResults; \t \t \t \t tempArray.push ([index, i]); \t \t \t \t array.myResults = tempArray; \t \t \t} \t \t} \t} – exoboy
Спасибо. Я просто добавил крошечную новую функцию (asdf.find = function() {}), вдохновленную вашим решением. – embassyhill
Отлично! Трудно всегда быть в состоянии интерпретировать то, что нужно людям ... поэтому я всегда счастлив, когда помогает решение! – exoboy