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?

Andrew Jackman
źródło
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;
Matt Ball
źródło
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 -

csantana
źródło
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.

Alex Dn
źródło
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);
wyrażenie regularne
źródło
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])

Kamil Kiełczewski
źródło
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.

user3094826
źródło
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();

Sudhir Bastakoti
źródło
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