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?

Andrew Jackman
la source
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;
Matt Ball
la source
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 -

csantana
la source
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.

Alex Dn
la source
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);
regex
la source
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])

Kamil Kiełczewski
la source
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é.

utilisateur3094826
la source
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();

Sudhir Bastakoti
la source
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