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.