2014-08-30 4 views
1

У меня есть этот массив, содержащий простые объектыУдаление объектов из массива в JavaScript

var data = [ 
{type:1, owner:"jason"}, 
{type:1, owner:"john"}, 
{type:2, owner:"jason"}, 
{type:2, owner:"alice"}, 
{type:2, owner:"bob"}, 
{type:2, owner:"clark"}, 
{type:1, owner:"david"} 
] 

Я пытаюсь перебрать массив и удаление только элементы с типом: 1. Это то, что я пробовал.

for(var i = 0; i < data.length; i++){ 
    if(data[i].type === 1){ 
    data.splice(i,1) 
    } 
} 

Было бы глупо предположить, что после этого цикл выполняется, что все элементы типа 1, будут удалены из массива. После запуска этого в инструментах chrome dev массив все еще содержит {type: 1, owner: "jason"} и все типы: 2 остались без изменений, как ожидалось. Что я делаю не так?

ответ

3

Вы должны просто уменьшаем i после сращивания

i--; 

КСТАТИ Я хотел бы просто использовать фильтр и присвоить результат той же переменной data как пыльник

data = data.filter(function(obj) { 
    return obj.type !== 1; 
}) 

console.log(data); 
+0

Wow! это работало как магия. Спасибо @Mritunjay. Думаю, я предпочитаю этот фильтр. Любая идея, насколько хорошо это работает на огромных больших наборах данных? – shanks

1

вы должны запустить i-- после splice, поскольку сплайсинг изменяет размер массива, индекс массива сразу же изменяется после удаления.

for(var i = 0; i < data.length; i++){ 
    if(data[i].type === 1){ 
    data.splice(i,1); 
    i--; 
    } 
} 
+0

Индекс 0 должен обрабатываться по-разному. – keeshux

+2

индекс 0 будет -1 после i--, но снова будет 0, когда текущий цикл завершится после i ++. – worldask

+0

спасибо @worldask. думаю, мое понимание метода сращивания ограничено. – shanks

1

Уменьшите i на 1 всякий раз, когда вы соединяете данные var. Потому что это означает, что список объектов массива становится меньше, поэтому позиция индекса сдвигается.

Поскольку вы не уменьшаетесь на 1, вы начинаете с Джейсона в позиции 0, а затем прямо переходите к Джейсону в позиции 2. ПОЧЕМУ это происходит? Поскольку вы нарезали объект в начале, ваша позиция индекса смещалась следующим образом.

Первый цикл: я = 0

var data = [ 
    {type:1, owner:"jason"},//position 0 
    {type:1, owner:"john"},//position 1 
    {type:2, owner:"jason"},//position 2 
    {type:2, owner:"alice"},//position 3 
    {type:2, owner:"bob"},//position 4 
    {type:2, owner:"clark"},//position 5 
    {type:1, owner:"david"}//position 6 
    ] 

Второй цикл я = 1

var data = [ 
    {type:1, owner:"jason"},//SPLICED 
    {type:1, owner:"john"},// position 0 
    {type:2, owner:"jason"}, //position 1 
    {type:2, owner:"alice"},// position 2 
    {type:2, owner:"bob"},//position 3 
    {type:2, owner:"clark"},//position 4 
    {type:1, owner:"david"}//position 5 
    ] 
+0

+1 для объяснения. Это именно то, что я хотел знать. @Amna Irfan спасибо :) – shanks

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