2012-02-20 15 views
8

tre ore fa, ho fatto una domanda in SO, sulla cancellazione di una parte di un oggetto, in modo da ho collegato questa domanda ad esso:Elimina da matrice in javascript

delete a part of object in javascript

ma ora un altro problema si è verificato quando Ho cancellato da quella matrice. Io uso quell'oggetto per popolare un FlexiGrid. ma quando elimino un elemento da tale oggetto dal seguente codice, invece di eliminare tale elemento, imposta su undefined :(e Flexigrid non ha accettato per i dati di input.

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

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

     delete Roomdata[i]; 
     break; 

    } 
}     

Per esempio, immaginate ho 3 articoli in Roomdata come questo:

{item1, item2, item3} 

Quando chiamo questo codice per eliminare item2, oggetto Roomdata assomiglia a questo:

{item1, undefined, item3} 

e questo è un cattivo formato per essere accettato da Flexigrid come dati di input

C'è qualche soluzione?

Grazie ogni corpo e dispiace per il mio cattivo sintassi (Sono nuovo in inglese)

saluti, Foroughi

+0

possibile duplicato del [array JavaScript Elimina elementi] (http://stackoverflow.com/questions/500606/javascript-array-delete-elements) - si prega di utilizzare la ricerca prima di Fai una domanda. –

+0

La risposta accettata alla tua domanda precedente suggerisce già di usare 'splice'. Perché fai questa domanda di nuovo? –

+0

Scusa @Felix, ma penso perché ho già fatto una domanda su questo problema, ho fatto questa domanda per aiutare i lettori a leggere una domanda più comprensibile, comunque mi dispiace per quello –

risposta

49

Passeggiata attraverso l'array in ordine inverso, e utilizzare .splice per rimuovere l'elemento.
Devi procedere nell'ordine inverso, perché altrimenti finisci per saltare elementi Vedi sotto.

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

Cosa succede se non si cammina in ordine 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

grazie per la risposta completa e i suoi commenti, comunque mi aiuti e sei fantastico, grazie ancora –

+2

Non devi attraversare l'elemento in ordine inverso mentre stai terminando il ciclo dopo aver chiamato 'splice' comunque. Se vuoi rimuovere più elementi da un array, allora sì, ma in questo caso non è necessario. –

+0

@FelixKling Hai ragione. Tuttavia, poiché la risposta accettata nell'altra domanda non ha funzionato, presumo che 'break;' debba essere rimosso. –

4

quello che hai è un Array. È necessario utilizzare splice() method per rimuovere un elemento da un array, non da delete ing.

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

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

     Roomdata.splice(i, 1); 
     break; 

    } 
} 
+2

Il secondo argomento specifica quanti elementi devono essere rimossi. ** '.splice (i, 0)' non rimuove nulla **. Anche se lo si sostituisce con '.splice (i, 1)', si salta gli elementi non tenendo conto dell'indice modificato. –

+0

@RobW: Whoops. E per quanto riguarda gli elementi saltati, sta comunque rompendo la rimozione, quindi niente salterà. – Matt

3

Utilizzando giunzione a dispetto di cancellazione.

Roomdata.splice(i, 0); 

l'attributo di splice rimuove gli elementi di stringa vuoti, i riferimenti non definiti, NULL e FALSE.

che possa risolvere il problema