2013-07-23 2 views
1

У меня есть массив объектов javascript: каждый объект содержит пары ключ/значение. Я пытаюсь выполнить итерацию через этот массив и удалить любой объект, значение которого для определенного ключа (например, «Промышленность») не соответствует заданному значению. Вот мой код, по какой-то причине это не перекручивания через весь массив, и я думаю, что это что-то делать с тем, что при удалении элемента счетчик цикла испорчен каким-то образом:jQuery итерации через элементы удаления цикла

var industry = 'testing'; 
var i = 0; 
for (i = 0; i < assets_results.length; i++) { 

    var asset = assets_results[i]; 
    var asset_industry = asset['industry']; 
    if (industry != asset_industry) { assets_results.splice(i,1); } 

} 

Есть идеи? Заранее спасибо.

+0

Вы правильно, то есть причина. если вы вырезаете 1-й, тогда 2-й будет первым, а i будет 1, поэтому один элемент уже пропущен. –

+0

Это не имеет никакого отношения к jquery –

+0

Простое решение: итерация по массиву в обратном порядке. –

ответ

0

Это связано с тем, что при сращивании одного элемента размер массива уменьшается на единицу. Все элементы после сращивания сдвигают одну позицию до начала массива и заполняют пространство сплайсинга. Таким образом, код пропускает один элемент. Попробуйте этот код.

var industry = 'testing'; 
var i = 0; 
for (i = 0; i < assets_results.length; i++) { 

    var asset = assets_results[i]; 
    var asset_industry = asset['industry']; 
    if (industry != asset_industry) { 
       assets_results.splice(i,1); 
       i--; 
    } 

} 
+1

Спасибо Aneesh, это код, который я использовал, отлично работает. – GluePear

0

сращивание удаляет элемент из массива и изменяет его:

var arra = ['A', 'B', 'C', 'D']; 
arr.splice(1,2); // -> ['A', 'D']; 

Это означает, что вы не должны увеличивать I, когда вы сращивать, потому что вы пропустите следующий элемент. сплайсинг сделает элемент i + 2 элементом i + 1.

var industry = 'testing'; 

for (var i = 0, max = assets_results.length; i < max;) { // Accessing a property is expensive. 
    if (industry != assets_results[i]['industry']) { 
     assets_results.splice(i,1); 
    } else { 
     ++i; 
    } 
} 
0

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

var industry = 'testing'; 
var i = 0; 
var asset_results_filtered = []; 

for (i = 0; i < assets_results.length; i++) { 
    if (industry == assets_results[i]) { 
     asset_results_filtered.push(assets_results[i]); 
    } 
} 

EDIT: ваш код выглядел несколько нелогичным - я изменил пример использования данных переменных.

0

Попробуйте вместо этого:

var industry = 'testing'; 
var i = assets_results.length - 1; 
for (; i > 0; i--) { 

    var asset = assets_results[i], 
     asset_industry = asset['industry']; 
    if (industry != asset_industry) { assets_results.splice(i,1); } 

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