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.