Função push () de objeto Javascript


101

Tenho um objeto javascript (na verdade, obtenho os dados por meio de uma solicitação ajax):

var data = {};

Eu adicionei algumas coisas nele:

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

Agora, quero remover todos os objetos com status inválido (mas manter tudo na mesma ordem):

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

Em minha mente, tudo isso deve funcionar, mas estou recebendo um erro que tempData.pushnão é uma função. Eu entendo por que não é o mesmo que um array, mas o que eu poderia fazer de outra forma?


4
Parece que você deve usar apenas uma matriz
Esailija

Respostas:


132

push()é para matrizes , não objetos , portanto, use a estrutura de dados correta.

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 venceu-me. Não se esqueça de mudar o for...inloop também.
Andy E

@MattBall meu mal! Eu não sou realmente adepto da revisão de SO e outras coisas! :)
Shouvik

1
Push é para array. Existe alguma maneira de adicionar um array a um objeto?
Venkat

1
E quanto à matriz associativa?
Kinnard Hockenhull

@KinnardHockenhull Desculpe, não entendi a pergunta. Você pode esclarecer o que está perguntando?
Matt Ball

17

Objetos não suportam a propriedade push, mas você também pode salvá-los usando o índice como chave,

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

Acho que é mais fácil remover o objeto se seu status for inválido, fazendo.

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

E, finalmente, você não precisa criar um var temp -


Adicione alguma explicação com a resposta de como esta resposta ajuda o OP a corrigir o problema atual
ρяσѕρєя K

5

Você deve fazer var tempData = new Array();

Push é uma função Array.


9
Por que new Array()e não []?
Matt Ball

3
[] é uma alternativa (atalho) para criar uma nova matriz. Pode ser feito com [] e com new Array ().
Alex Dn

6
[]é a principal forma de criar arrays, as outras são alternativas e podem até ser sobrescritas.
Esailija

6
Consulte stackoverflow.com/questions/885156/… para uma discussão sobre por que o new Array()mal é
Jonas Høgh

w3schools.com/js/js_obj_array.asp new Array é um array regular. Onde [] definido como primário?
Alex Dn

3

A linguagem de programação Javascript oferece suporte ao paradigma de programação funcional para que você possa fazer isso facilmente com esses 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

Eu presumo que REALMENTE você obtém o objeto do servidor e deseja obter o objeto na saída

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


0
    tempData.push( data[index] );

Concordo com a resposta correta acima, mas .... você ainda não está fornecendo o valor do índice para os dados que deseja adicionar a tempData. Sem o valor [índice], todo o array será adicionado.


Descreva como resolver o problema em detalhes. Obrigado.
Leonid Glanz,

Isso seria corrigir a resposta aceita de Matt Ball. Como estamos fazendo um loop pelos dados, devemos apenas enviar os dados [índice], não os dados inteiramente.
Jonathan Bergeron

-2

Faz :


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


4
Por que new Array()e não []?
Matt Ball

observe a diferença entre new Array (); e um novo Array; Você deve ser capaz de responder a essas perguntas em vez de falar sobre alternativas.
Jonathan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.