2012-02-20 2 views
8

3 часа назад, я задал вопрос в SO, об удалении части объекта, поэтому я связывал этот вопрос к нему:Удалить из массива в JavaScript

delete a part of object in javascript

но теперь другая проблема возникла, когда Я удалился из этого массива. Я использую этот объект для заполнения FlexiGrid. но при удалении элемента из этого объекта с помощью следующего кода, вместо того, чтобы удалить этот элемент, он устанавливает на неопределенный :(и Flexigrid не принял его для ввода данных.

for (var i = 0; i < Roomdata.length; i++) { 

    if(Roomdata[i].id = X) { 

     delete Roomdata[i]; 
     break; 

    } 
}     

Например, представьте себе, у меня есть 3 пунктов в Roomdata, как это:

{item1, item2, item3} 

Когда я называю этот код, чтобы удалить ст.2, объект Roomdata выглядит следующим образом:

{item1, undefined, item3} 

и это плохой формат, чтобы быть принятым в качестве Flexigrid входные данные

Есть ли решение?

Спасибо каждое тело и извините мой плохой синтаксис (я новичок на английском языке)

С уважением, Foroughi

+0

возможный дубликат [JavaScript массив Удалить элементы] (http://stackoverflow.com/questions/500606/javascript-array-delete-elements) - пожалуйста, используйте поиск перед вами Задайте вопрос. –

+0

Принятый ответ на ваш предыдущий вопрос уже предлагает использовать 'splice'. Почему вы снова задаете этот вопрос? –

+0

Извините @Felix, но я думаю, потому что я уже задал вопрос об этой проблеме, я задал этот вопрос, чтобы помочь читателям прочитать более понятный вопрос, в любом случае извините за это –

ответ

49

Пройдите через массив в обратном порядке и используйте .splice, чтобы удалить элемент.
Вы должны ходить в обратном порядке, потому что иначе вы в конечном итоге пропускаете элементы См. Ниже.

for (var i = Roomdata.length-1; i >= 0; i--) { 
    if (Roomdata[i].id == X) { 
     Roomdata.splice(i, 1); 
     break; 
    } 
} 

Что произойдет, если вы не ходите в обратном порядке:

// This happens in a for(;;) loop: 
// Variable init: 
var array = [1, 2, 3]; 
var i = 0; 

array.splice(i, 1); // array = [2, 3] array.length = 2 
// i < 2, so continue 
i++; // i = 1  

array.splice(i, 1); // i=1, so removes item at place 1: array = [2] 
// i < 1 is false, so stop. 

// array = [2]. You have skipped one element. 
+1

Благодарим вас за полный ответ и его комментарии, так или иначе вы мне поможете, и вы здоровы, спасибо снова –

+2

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

+0

@FelixKling Вы правы. Однако, поскольку принятый ответ по другому вопросу не сработал, я предполагаю, что 'break;' нужно удалить. –

4

Что у вас есть это массив. Вы должны использовать splice() method для удаления элемента из массива, а не с помощью delete элемента.

for (var i = 0; i < Roomdata.length; i++) { 

    if(Roomdata[i].id = X) { 

     Roomdata.splice(i, 1); 
     break; 

    } 
} 
+2

Второй аргумент указывает, сколько элементов нужно удалить. ** '.splice (i, 0)' ничего не удаляет **. Даже если вы замените его на '.splice (i, 1)', вы пропускаете элементы, не учитывая измененный индекс. –

+0

@RobW: Упс. А что касается пропусков элементов, он все равно ломается при удалении, поэтому ничто не будет пропущено. – Matt

3

Использование сращивания, несмотря на удаление.

Roomdata.splice(i, 0); 

атрибут splice удаляет элементы пустой строки, неопределенные ссылки, NULL и FALSE.

это решит вашу проблему

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