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.