2013-04-10 3 views
2

Я стучал нуб головой о стену на этом ...Trouble удаления элементов из многомерного массива, используя цикл (JavaScript)

У меня есть следующий код:

var guns2 = 
[ 
["Model 17", "Glock"], 
["Model 19", "Glock"], 
["PPQ", "Walther"], 
["P2000", "HK"], 
["Model 92", "Beretta"], 
["Model 34", "Glock"] 
] 

var gunsMake = function() { 
    for (i=0; i<guns2.length; i++){ 
     var make = guns2[i][1]; 
      if (make ==="Glock"){ 
       } 
      else { 
       guns2.splice(i,1); 
       } 
     }; 
    }; 
gunsMake(); 
console.log(guns2); 

Результат Я получаю в консоли выглядит следующим образом:

[["Model 17", "Glock"], ["Model 19", "Glock"], ["P2000", "HK"], ["Model 34", "Glock"]] 

То, что я хотел бы видеть, как:

[["Model 17", "Glock"], ["Model 19", "Glock"], ["Model 34", "Glock"]] 

«[« P2000 »,« HK »]« не должно быть быть там ... У меня такое чувство, что оно имеет какое-то отношение к аргументу «guns2.length» в цикле for. так как он пропускает последующий массив каждый раз, когда он сращивается, но я не могу полностью обмотать мозг вокруг исправления.

Пожалуйста, кто-то направить меня правильно :)

+1

Не изменяйте массив в то время как вы итерацию над ним. Вставьте желаемые результаты в другой массив. –

+0

Ах, это тонна смысла, особенно для того, что мне нужно достичь в моей конечной цели. Будет ли «толчок» эффективным способом для достижения этого? –

+0

Да, 'push' - это один из способов добавления элементов в массив. Сначала вам нужно создать другой массив, а затем «нажать» его внутри цикла. –

ответ

3

Не всегда сложно изменить массив на месте. Если это вы решите сделать, уменьшите i, когда вы удалите элемент.

http://jsfiddle.net/kVzLn/

var guns2 = 
[ 
["Model 17", "Glock"], 
["Model 19", "Glock"], 
["PPQ", "Walther"], 
["P2000", "HK"], 
["Model 92", "Beretta"], 
["Model 34", "Glock"] 
] 

var gunsMake = function() { 
    for (i=0; i<guns2.length; i++){ 
     var make = guns2[i][1]; 
      if (make ==="Glock"){ 
       } 
      else { 
       guns2.splice(i--,1); // Decrement i here 
       } 
     }; 
    }; 
gunsMake(); 
console.log(guns2); 
+0

Awesome. Для этого конкретного приложения я, вероятно, собираюсь пойти с предложением Асада о том, чтобы перейти к новому массиву, но вы посоветовали работать как шарм. Благодаря! –

6

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

var gunsMake = function (guns, desiredMake) { 
    return guns.filter(function(v,i,a){ 
     return v[1] == desiredMake; 
    }); 
}; 
guns2 = gunsMake(guns2, "Glock"); 
console.log(guns2); 

Подробнее о методе массива filter на MDN: Array filter method

+0

Асад, еще раз спасибо за помощь. Я дам фильтр выстрел - выглядит довольно мощным методом. Очень признателен. –

+1

Yup, проблем нет. Вы должны взглянуть на другие методы массива (также зарегистрированные на MDN). Когда вы знакомы с ними, они в значительной степени избегают необходимости использовать цикл 'for' в большинстве случаев. –

1

вы удаляете (сплайсинг) узлы из вашего массива в то время как вы перекручивание через него с фиксированным индексом. Таким образом, вы не проверяете все элементы.

Если вы отметили элемент №1 и решили удалить его, то при проверке №2 вы фактически проверяете # 3.

+0

Да, вот что я понял (спасибо за подтверждение). Я просто не знал, как это сделать. –

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

  • Нет связанных вопросов^_^