2016-08-10 4 views
0

Я пытаюсь пройти через столбцы, используя цикл while, но каждый раз, когда я получаю сообщение об ошибке, мне было интересно, если вы, ребята, можете сказать мне, что я сделал неправильно. код заключается в следующем:Ошибка цикла многомерного массива

var arr = [ 
    [['cat', 'fish'],['dog', 'meat']], 
    [['cat', 'toy'],['dog', 'bone']], 
    [['cat', 'fish'],['dog', 'bone']] 
]; 

var position = 0; 
//can I do this in stead? 
//while(arr.length > position){ 

while(true){ 
    var arrEnd = true; 
    for (var k = 0; k < arr.length; k++) { 
    if(arr.length > position){ 
     arrEnd = false; 
    } 
    } 

    if(arrEnd){break;} 

    for(var i =0; i < arr.length;i++){ 
    for(var j =0; j < arr.length;j++){ 
     if(i != j && arr[i][position][1] == arr[j][position][1]){ 
     console.log(arr[i][position]+'===='+arr[j][position]); 
     } 
    } 
    } 
    position++; 
} 
//Expected: 
// "cat,fish====cat,fish" "cat,fish====cat,fish" 
// "dog, bone====dog,bone" "dog, bone====dog,bone" 
//Error getting: arr[i][position] is undefined 

Что не так? Я не вижу проблемы.

+0

Почему вы идете через тот же массив в 3 раза? – smnbbrv

+0

Можете ли вы рассказать нам, чего вы хотите достичь или какой результат вы хотите достичь в конце? –

+0

@GopinathShiva Я добавляю то, что ожидал. – Zorgg

ответ

1

У вас есть трехмерный массив. Первоначально вы используете position против первого индекса массива, а затем, где возникает ошибка, вы используете position для ссылки на второй индекс. Поскольку первое измерение больше второго измерения, вы в конечном итоге получаете ошибку в результате того, что значение по запрашиваемому индексу не определяется.

Предполагая, что внутренние массивы имеют одинаковую длину на каждом уровне, это работает:

var arr = [ 
    [['cat', 'fish'],['dog', 'meat']], 
    [['cat', 'toy'],['dog', 'bone']], 
    [['cat', 'fish'],['dog', 'bone']] 
]; 

var position = 0; 
while(true){ 
    var arrEnd = true; 
    for (var k = 0; k < arr[0].length; k++) { 
    if(arr[0].length > position){ 
     arrEnd = false; 
    } 
    } 

    if(arrEnd){break;} 

    for(var i =0; i < arr.length;i++){ 
    for(var j =0; j < arr.length;j++){ 
     if(i != j && arr[i][position][1] == arr[j][position][1]){ 
     console.log(arr[i][position]+'===='+arr[j][position]); 
     } 
    } 
    } 
    position++; 
} 

Обратите внимание на дополнительные [0] с в первом цикле for.

Хотя, на самом деле, код должен быть изменен, чтобы быть более ясно, что происходит с тем, чтобы такие вопросы, как это проще, чтобы увидеть:

var arr = [ 
    [['cat', 'fish'],['dog', 'meat']], 
    [['cat', 'toy'],['dog', 'bone']], 
    [['cat', 'fish'],['dog', 'bone']] 
]; 

for(var i=0; i < arr.length-1; i++){ 
    for(var j=i+1; j < arr.length; j++){ 
    for(var k=0; k < arr[i].length; k++){ 
     if(arr[i][k][1] == arr[j][k][1]) { 
     console.log(arr[i][k]+'===='+arr[j][k]); 
     } 
    } 
    } 
} 
0

Ваша проблема с while (true) и position++ за пределами for. В конце концов, position будет больше 1, что приведет к точной ошибке, которую вы получаете.

Еще одна вещь, которую следует отметить, ваша arr имеет длину 3, а максимальное число позиций (индекс второго измерения) - 1 (поскольку у вас в вашем подмассиве есть 2 массива).

Вместо вашей вложенной петли for попробуйте использовать Array.prototype.forEach.

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