Fonction push () de l'objet Javascript


101

J'ai un objet javascript (j'obtiens en fait les données via une requête ajax):

var data = {};

J'y ai ajouté des trucs:

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

Maintenant, je veux supprimer tous les objets avec un statut invalide (mais garder tout le même ordre):

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

Dans mon esprit, tout cela devrait fonctionner, mais j'obtiens une erreur qui tempData.pushn'est pas une fonction. Je comprends pourquoi ce n'est pas la même chose qu'un tableau, mais que pourrais-je faire autrement?


4
Il semble que vous devriez simplement utiliser un tableau
Esailija

Réponses:


132

push()est pour les tableaux , pas pour les objets , utilisez donc la bonne structure de données.

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 m'a battu. N'oubliez pas de changer la for...inboucle aussi.
Andy E

@MattBall mon mauvais! Je ne suis pas vraiment adepte de la revue SO et tout ça! :)
Shouvik

1
Push est pour un tableau, existe-t-il un moyen d'ajouter un tableau à un objet?
Venkat

1
Qu'en est-il du tableau associatif?
Kinnard Hockenhull

@KinnardHockenhull Je suis désolé, je ne comprends pas la question. Pouvez-vous clarifier ce que vous demandez?
Matt Ball

17

Objects ne prend pas en charge la propriété push, mais vous pouvez également l'enregistrer en utilisant l'index comme clé,

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

Je pense que c'est plus facile si vous supprimez l'objet si son statut est invalide, en le faisant.

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

Et enfin, vous n'avez pas besoin de créer un var temp -


Ajoutez une explication avec une réponse sur la manière dont cette réponse aide OP à résoudre le problème actuel
ρяσѕρєя K

5

Vous devez faire var tempData = new Array();

Push est une fonction Array.


9
Pourquoi new Array()et pas []?
Matt Ball

3
[] est une alternative (raccourci) pour créer un nouveau tableau. Cela peut être fait avec [] et avec new Array ().
Alex Dn

6
[]est le principal moyen de créer des tableaux, les autres sont des alternatives et peuvent même être écrasés.
Esailija

6
Voir stackoverflow.com/questions/885156/… pour une discussion sur le pourquoi du new Array()mal
Jonas Høgh

w3schools.com/js/js_obj_array.asp new Array est un tableau normal. Où [] défini comme primaire?
Alex Dn

3

Le langage de programmation Javascript prend en charge le paradigme de programmation fonctionnelle afin que vous puissiez facilement utiliser ces codes.

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

2

Je suppose que VRAIMENT vous obtenez un objet du serveur et que vous voulez obtenir un objet en sortie

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


0
    tempData.push( data[index] );

Je suis d'accord avec la bonne réponse ci-dessus, mais .... vous ne donnez toujours pas la valeur d'index pour les données que vous souhaitez ajouter à tempData. Sans la valeur [index], tout le tableau sera ajouté.


Veuillez décrire comment résoudre le problème en détail. Merci.
Leonid Glanz

Ce serait corriger la réponse acceptée de Matt Ball. Comme nous parcourons les données en boucle, nous ne devons pousser que les données [index], pas entièrement les données.
Jonathan Bergeron

-2

Faire :


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


4
Pourquoi new Array()et pas []?
Matt Ball

notez la différence entre new Array (); et nouveau Array; Vous devriez être en mesure de répondre à de telles questions au lieu de parler d'alternatives.
Jonathan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.