Función push () de objeto Javascript

101

Tengo un objeto javascript (de hecho, obtengo los datos a través de una solicitud ajax):

var data = {};

Le he añadido algunas cosas:

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

Ahora quiero eliminar todos los objetos con un estado no válido (pero mantener todo en el mismo orden):

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

En mi opinión, todo esto debería funcionar, pero recibo un error que tempData.pushno es una función. Entiendo por qué no es lo mismo que una matriz, pero ¿qué podría hacer de otra manera?

Andrew Jackman
fuente
4
Parece que debería usar una matriz
Esailija

Respuestas:

132

push()es para matrices , no para objetos , así que use la estructura de datos correcta.

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
fuente
9
+1 me ganó. No olvide cambiar el for...inbucle también.
Andy E
@MattBall mi mal! ¡No soy tan experto en SO review y esas cosas! :)
Shouvik
1
Push es para matriz, ¿hay alguna forma de agregar una matriz a un objeto?
Venkat
1
¿Qué pasa con la matriz asociativa?
Kinnard Hockenhull
@KinnardHockenhull Lo siento, no entiendo la pregunta. ¿Puedes aclarar lo que estás preguntando?
Matt Ball
17

Los objetos no admiten la propiedad push, pero también puede guardarlos usando el índice como clave,

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

Creo que esto es más fácil si se elimina el objeto si su estado no es válido.

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

Y finalmente no necesitas crear una var temp -

csantana
fuente
Agregue una explicación con la respuesta de cómo esta respuesta ayuda a OP a solucionar el problema actual
ρяσѕρєя K
5

Usted debe hacer var tempData = new Array();

Push es una función de matriz.

Alex Dn
fuente
9
¿Por qué new Array()y no []?
Matt Ball
3
[] es una alternativa (atajo) para crear una nueva matriz. Se puede hacer con [] y con new Array ().
Alex Dn
6
[]es la forma principal de crear matrices, las otras son alternativas e incluso se pueden sobrescribir.
Esailija
6
Vea stackoverflow.com/questions/885156/… para una discusión de por qué new Array()es el mal
Jonas Høgh
w3schools.com/js/js_obj_array.asp new Array es una matriz regular. ¿Dónde [] se define como principal?
Alex Dn
3

El lenguaje de programación Javascript admite el paradigma de programación funcional, por lo que puede hacerlo fácilmente con estos códigos.

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

Supongo que REALMENTE obtienes el objeto del servidor y quieres obtener el objeto en la salida

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

Kamil Kiełczewski
fuente
0
    tempData.push( data[index] );

Estoy de acuerdo con la respuesta correcta anterior, pero ... aún no está dando el valor de índice para los datos que desea agregar a tempData. Sin el valor de [índice], se agregará toda la matriz.

usuario3094826
fuente
Describa en detalle cómo solucionar el problema. Gracias.
Leonid Glanz
Esto sería para corregir la respuesta aceptada de Matt Ball. A medida que recorremos los datos, solo debemos enviar datos [índice], no datos en su totalidad.
Jonathan Bergeron
-2

Hacer:


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

Sudhir Bastakoti
fuente
4
¿Por qué new Array()y no []?
Matt Ball
observe la diferencia entre new Array (); y nueva matriz; Debería poder responder a estas preguntas en lugar de hablar de alternativas.
Jonathan