Funzione push () dell'oggetto Javascript


101

Ho un oggetto javascript (in realtà ottengo i dati tramite una richiesta ajax):

var data = {};

Ho aggiunto alcune cose:

data[0] = { "ID": "1"; "Status": "Valid" }
data[1] = { "ID": "2"; "Status": "Invalid" }

Ora voglio rimuovere tutti gli oggetti con uno stato non valido (ma mantenere tutto nello stesso ordine):

var tempData = {};
for ( var index in data ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

Nella mia mente, tutto questo dovrebbe funzionare, ma ricevo un errore che tempData.pushnon è una funzione. Capisco perché non è uguale a un array, ma cosa potrei fare altrimenti?


4
Sembra che dovresti usare solo un array
Esailija

Risposte:


132

push()è per gli array , non per gli oggetti , quindi usa la giusta struttura dati.

var data = [];
// ...
data[0] = { "ID": "1", "Status": "Valid" };
data[1] = { "ID": "2", "Status": "Invalid" };
// ...
var tempData = [];
for ( var index=0; index<data.length; index++ ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

9
+1 mi ha battuto. Non dimenticare di cambiare anche il for...inciclo.
Andy E

@ MattBall mio male! Non sono davvero così abile in SO review e cose del genere! :)
Shouvik

1
Push è per array, esiste un modo per aggiungere un array a un oggetto?
Venkat

1
E la matrice associativa?
Kinnard Hockenhull

@KinnardHockenhull Mi dispiace, non capisco la domanda. Puoi chiarire cosa stai chiedendo?
Matt Ball

17

Gli oggetti non supportano la proprietà push, ma puoi salvarla anche usando l'indice come chiave,

var tempData = {};
for ( var index in data ) {
  if ( data[index].Status == "Valid" ) { 
    tempData[index] = data; 
  } 
 }
data = tempData;

Penso che questo sia più facile se rimuovi l'oggetto se il suo stato non è valido, facendo.

for(var index in data){
  if(data[index].Status == "Invalid"){ 
    delete data[index]; 
  } 
}

E infine non è necessario creare un var temp -


Aggiungi qualche spiegazione con la risposta su come questa risposta aiuti OP a risolvere il problema attuale
ρяσsρєя K

5

Devi fare var tempData = new Array();

Push è una funzione Array.


9
Perché new Array()e no []?
Matt Ball

3
[] è un'alternativa (scorciatoia) per creare un nuovo array. Può essere fatto con [] e con new Array ().
Alex Dn

6
[]è il modo principale per creare array, gli altri sono alternative e possono anche essere sovrascritti.
Esailija

6
Vedi stackoverflow.com/questions/885156/… per una discussione sul perché new Array()è malvagio
Jonas Høgh

w3schools.com/js/js_obj_array.asp new Array è un array normale. Dove [] è definito come primario?
Alex Dn

3

Il linguaggio di programmazione Javascript supporta il paradigma di programmazione funzionale, quindi puoi farlo facilmente con questi codici.

var data = [
    {"Id": "1", "Status": "Valid"},
    {"Id": "2", "Status": "Invalid"}
];
var isValid = function(data){
    return data.Status === "Valid";
};
var valids = data.filter(isValid);

2

Presumo che DAVVERO si ottiene l'oggetto dal server e si desidera ottenere l'oggetto in uscita

Object.keys(data).map(k=> data[k].Status=='Invalid' && delete data[k])


0
    tempData.push( data[index] );

Sono d'accordo con la risposta corretta sopra, ma ... non stai ancora dando il valore di indice per i dati che vuoi aggiungere a tempData. Senza il valore [index] verrà aggiunto l'intero array.


Descrivi in ​​dettaglio come risolvere il problema. Grazie.
Leonid Glanz

Ciò significherebbe correggere la risposta accettata da Matt Ball. Dato che stiamo scorrendo i dati, dovremmo solo spingere i dati [indice], non i dati interamente.
Jonathan Bergeron

-2

Fare :


var data = new Array();
var tempData = new Array();


4
Perché new Array()e no []?
Matt Ball

notare la differenza tra new Array (); e nuovo Array; Dovresti essere in grado di rispondere a queste domande invece di parlare di alternative ..
Jonathan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.