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?


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;

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 -


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.


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);

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])


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.


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();


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.