2015-02-11 3 views
3

У меня есть три многомерных массива. Функция findIndex будет проходить через один из массивов, если я установил последнюю строку findIndex (arrayTwo) и выплюнул переменную item и index, указав мне, где находится переменная idName.Прохождение через массив многомерных массивов JS и ведение журнала индексов

Пример: если я вызову findIndex (arrayTwo), он будет конфисковать элемент журнала: 2 | индекс: 1 http://jsfiddle.net/vap03jfL/

Проблема в том, что при запуске функции findIndex (arrayCombine) она будет выполнять поиск только по первым двум уровням нового набора массивов. Я знаю, что мне нужно искать один уровень глубже и возвращать значение для самого верхнего массива, но я не нашел того, что мне нужно. Я также читал, что способ, которым я это делаю, может быть не лучшим. начать с.

var arrayOne = [ 
    ["a", "b", "c", "d"], 
    ["e", "f", "g", "h"], 
    ["i", "j", "k", "l"], 
    ["m", "n", "o", "p"] 
]; 

var arrayTwo = [ 
    ["Z1", "Y1", "X2", "W2"], 
    ["V2", "U3", "T3", "S3"], 
    ["R3", "Q3", "P3", "O3"], 
    ["N4", "M2", "L2", "K2"] 
]; 

var arrayThree = [ 
    ["Z", "Y", "X", "W"], 
    ["V", "U", "T", "S"], 
    ["R", "Q", "P", "O"], 
    ["N", "M", "L", "K"] 
]; 

var arrayCombine = [ 
    [arrayOne], 
    [arrayTwo], 
    [arrayThree] 
] 


function findIndex(arrayArg) { 
    idName = "Q3"; 

    for (var item in arrayArg) { 
     console.log("item: " + item); 
     if (arrayArg[item].indexOf(idName)) { 
      var index = arrayArg[item].indexOf(idName); 
      console.log("index: " + index); 
      if (index != -1) { 
       console.log("item found: " + item); 
       console.log("index found: " + index); 
       break; 
      } 
     } 
    } 
} 

findIndex(arrayCombine); 

Любая помощь была бы принята с благодарностью. Спасибо.

+0

поясню немного ... В настоящее время изменения вызова функции в нижней части к findIndex (arrayTwo) и до сих пор в поисках «Q3» на выходе соответствует ожидаемое место в массиве. "найденный товар: 2" | «найденный индекс: 1» С вызовом findIndex (arrayCombine) Я ищу вывод из «массив: 1» | "найденный товар: 2" | «найденный индекс: 1» Таким образом, я могу использовать эти переменные и подключить их к другой функции в другом месте. –

ответ

0

Вот решение, с которым я столкнулся. http://jsfiddle.net/vap03jfL/7/

Проблема 1: вложенный массив был написан неправильно, я не должен был заключать в скобки переменную, вызываемую во вложенном массиве, она должна была быть написана.

var arrayCombine = [arrayOne, arrayTwo, arrayThree]; 

Задача 2: мне нужно было разобрать еще один уровень .. это немного другая стратегия, но работает с неровными массивами тоже.

функция findIndex (arrayArg) { idName = "Q3";

for (var arrayId = 0; arrayId < arrayArg.length; arrayId++) { 
    for (var item = 0; item < arrayArg[arrayId].length; item++) { 
     var index = arrayArg[arrayId][item].indexOf(idName); 
     if (index >= 0) { 
      console.log("arrayId " + arrayId + " | item: " + item + " | Found Index! " + index); 

     } 
    } 
} 

}

0
function findIndex(arrayArg, idName) { 
    for (var i in arrayArg) { 
     console.log("item: " + item); 
     var item = arrayArg[i]; 
     if(item instanceof Array) { 
      if(findIndex(item, idName)) { 
       return true; 
      } 
     } else if (item.indexOf(idName)) { 
      var index = item.indexOf(idName); 
      console.log("index: " + index); 
      if (index != -1) { 
       console.log("item found: " + item); 
      } 
     } 
    } 
} 
+0

Ваша функция вернется преждевременно, если искомый идентификатор не находится в первом массиве, который вы попали в цикл. Кроме того, нет никакого условия возврата из findIndex, который будет указывать, был ли поиск успешным. – kellanburket

+0

yup you right. исправил его –

+0

спасибо за мысли, но когда я попробовал это в скрипке, он не работал на меня. Не уверен, что мне не хватало, но я разместил свое решение в скрипке ниже. –

1

Вам необходимо сделать свою функцию рекурсивной для обработки глубокого поиска.

function findIndex(arrayArg, idName) { 

    for (var item in arrayArg) { 
     if (typeof arrayArg[item] == "object" && arrayArg[item] != null) { 
      if (findIndex(arrayArg[item], idName)) { 
       return true 
      } 
     } else { 
      var index = arrayArg[item].indexOf(idName) 
      if (index != -1) { 
       console.log("item found: " + item); 
       console.log("index found: " + index); 
       return true; 
      } else { 
       console.log(arrayArg[item] + " != " + idName); 
      }   
     } 
    } 
    return false; 
} 

findIndex(arrayCombine, "Q3"); 

Вместо вложенности, если операторы внутри циклов внутри, если заявления, вы можете использовать силу рекурсии, чтобы сделать глубокий поиск без верхнего предела по количеству вложенных массивов или объектов, которые разрешено сканировать.

+0

спасибо за мысли, но когда я попробовал это в скрипке, он не работал на меня. Не знаю, чего я пропустил, но я разместил свое решение в скрипке ниже. –

+0

Хм. Я просто запустил его, и он сделал то, что я сказал, что это будет делать: https://jsfiddle.net/maapxgoL/1/.Единственная проблема, которую я вижу, заключается в том, что она управляет протоколом индекса элемента массива, а не строки - я редактировал его так, чтобы он также регистрировал имя элемента. Ваше решение, работающее для конкретной проблемы, не способно обрабатывать глубоко вложенные массивы (например, тот, который вы первоначально разместили). В качестве программиста вы должны стремиться к повторному использованию кода, который может быть повторно применен при изменении величины и характера вашего ввода. – kellanburket

Смежные вопросы