Funkcja push () obiektu JavaScript


102

Mam obiekt javascript (faktycznie otrzymuję dane poprzez żądanie AJAX):

var data = {};

Dodałem do niego kilka rzeczy:

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

Teraz chcę usunąć wszystkie obiekty z nieprawidłowym statusem (ale zachowaj kolejność w tej samej kolejności):

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

Moim zdaniem wszystko to powinno działać, ale otrzymuję błąd, który tempData.pushnie jest funkcją. Rozumiem, dlaczego to nie to samo, co tablica, ale co mogę zrobić inaczej?


4
Wygląda na to, że powinieneś po prostu użyć tablicy
Esailija

Odpowiedzi:


132

push()dotyczy tablic , a nie obiektów , więc używaj odpowiedniej struktury danych.

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 pokonaj mnie. Nie zapomnij też zmienić for...inpętli.
Andy E

@MattBall my bad! Nie jestem tak biegły w recenzowaniu SO i takich tam! :)
Shouvik,

1
Wypychanie jest dla tablicy. Czy istnieje sposób na dodanie tablicy do obiektu?
Venkat,

1
A co z tablicą asocjacyjną?
Kinnard Hockenhull

@KinnardHockenhull Przepraszam, nie rozumiem pytania. Czy możesz wyjaśnić, o co pytasz?
Matt Ball

18

Obiekty nie obsługują właściwości push, ale można ją również zapisać, używając indeksu jako klucza,

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

Myślę, że jest to łatwiejsze, jeśli usuniesz obiekt, jeśli jego status jest nieprawidłowy, wykonując.

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

I wreszcie nie musisz tworzyć zmiennej temp -


Dodaj wyjaśnienie wraz z odpowiedzią, w jaki sposób ta odpowiedź pomaga OP w naprawianiu bieżącego problemu
ρяσѕρєя K

5

Musisz zrobić var tempData = new Array();

Push to funkcja Array.


9
Dlaczego new Array()a nie []?
Matt Ball,

3
[] jest alternatywą (skrótem) do tworzenia nowej tablicy. Można to zrobić za pomocą [] i nowej Array ().
Alex Dn

6
[]jest podstawowym sposobem tworzenia tablic, inne są alternatywami i mogą nawet zostać nadpisane.
Esailija,

6
Zobacz stackoverflow.com/questions/885156/... do dyskusji, dlaczego new Array()jest zło
Jonas Høgh

w3schools.com/js/js_obj_array.asp new Array to zwykła tablica. Gdzie [] zdefiniowano jako podstawowe?
Alex Dn

3

Język programowania Javascript obsługuje paradygmat programowania funkcjonalnego, dzięki czemu można łatwo zrobić z tymi kodami.

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

2

Zakładam, że NAPRAWDĘ otrzymujesz obiekt z serwera i chcesz uzyskać obiekt na wyjściu

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


0
    tempData.push( data[index] );

Zgadzam się z poprawną odpowiedzią powyżej, ale .... nadal nie podajesz wartości indeksu dla danych, które chcesz dodać do tempData. Bez wartości [index] zostanie dodana cała tablica.


Proszę szczegółowo opisać, jak rozwiązać problem. Dzięki.
Leonid Glanz

Miałoby to na celu poprawienie zaakceptowanej odpowiedzi Matta Balla. Ponieważ przeglądamy dane, powinniśmy wypychać tylko dane [indeks], a nie dane całkowicie.
Jonathan Bergeron

-2

Robić :


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


4
Dlaczego new Array()a nie []?
Matt Ball,

zwróć uwagę na różnicę między nową Array (); i nowy Array; Powinieneś być w stanie odpowiedzieć na takie pytania, zamiast mówić o alternatywach ...
Jonathan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.