2012-02-20 8 views
8

3 horas, he hecho una pregunta en el SO, acerca de la eliminación de una parte de un objeto, por lo que he vinculado a esta pregunta a ella:Borrar de la matriz en Javascript Hace

delete a part of object in javascript

pero ahora ocurrió otro problema cuando Borré de esa matriz. Utilizo ese objeto para llenar un FlexiGrid. pero cuando se borra un elemento de ese objeto por el siguiente código, en lugar de eliminar ese elemento, se establece en undefined :(y Flexigrid no lo aceptó para los datos de entrada.

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

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

     delete Roomdata[i]; 
     break; 

    } 
}     

Por ejemplo, imagina que tengo 3 artículos en Roomdata así:

{item1, item2, item3} 

Cuando llamo a este código para eliminar elemento2, objeto Roomdata se ve así:

{item1, undefined, item3} 

y esto es un mal formato para ser aceptado por Flexigrid como datos de entrada

¿Hay alguna solución?

Gracias cada cuerpo y lo de mi mala sintaxis (Soy nuevo en Inglés)

respecto, Foroughi

+0

posible duplicado de [matriz de JavaScript Eliminar Elementos] (http://stackoverflow.com/questions/500606/javascript-array-delete-elements) - utilice la búsqueda antes Haz una pregunta. –

+0

La respuesta aceptada a su pregunta anterior ya sugiere utilizar 'empalme'. ¿Por qué haces esta pregunta nuevamente? –

+0

Lo siento @Felix, pero creo que porque ya hice una pregunta sobre este tema, hice esta pregunta para ayudar a los lectores a leer una pregunta más comprensible, de todos modos disculpa por eso –

Respuesta

49

Walk a través de la matriz en orden inverso, y el uso .splice para eliminar el elemento.
Tienes que caminar en el orden inverso, porque de lo contrario terminas salteando elementos Ver abajo.

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

¿Qué pasa si no entras en el orden inverso:

// 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

gracias por la respuesta completa y sus comentarios, de todos modos me ayudaste y eres genial, gracias de nuevo –

+2

No tienes que atravesar el elemento en orden inverso ya que estás terminando el ciclo después de llamar '' empalme' de todos modos. Si desea eliminar varios elementos de una matriz, entonces sí, pero en este caso no es necesario. –

+0

@FelixKling Tienes razón. Sin embargo, dado que la respuesta aceptada en la otra pregunta no funcionó, asumo que 'break;' debe eliminarse. –

4

Lo que tienes es una matriz de. Debe usar splice() method para eliminar un elemento de una matriz, no por delete ing el elemento.

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

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

     Roomdata.splice(i, 1); 
     break; 

    } 
} 
+2

El segundo argumento especifica cuántos elementos deben eliminarse. ** '.splice (i, 0)' no elimina nada **. Incluso si lo reemplaza con '.splice (i, 1)', se salteará elementos al no tener en cuenta el índice modificado. –

+0

@RobW: ¡Vaya! Y en cuanto a saltarse elementos, él está rompiendo la eliminación de todos modos, por lo que nada saltará. – Matt

3

El uso de empalme, a pesar de eliminación.

Roomdata.splice(i, 0); 

El atributo de empalme elimina elementos de serie en blanco, referencias indefinidas, NULLs y FALSE.

se va a resolver su problema