Dodawanie / usuwanie elementów z obiektu JavaScript za pomocą jQuery

82

Mam następujący obiekt JavaScript:

var data = {items: [
    {id: "1", name: "Snatch", type: "crime"},
    {id: "2", name: "Witches of Eastwick", type: "comedy"},
    {id: "3", name: "X-Men", type: "action"},
    {id: "4", name: "Ordinary People", type: "drama"},
    {id: "5", name: "Billy Elliot", type: "drama"},
    {id: "6", name: "Toy Story", type: "children"}
]};

Gdybym chciał dodać / usunąć elementy z tej listy, jak bym to zrobił używając jQuery? Klient chce, aby ta lista była dynamicznie modyfikowana.

Magnes robaka
źródło
2
To nie jest JSON. To jest dosłowny obiekt: benalman.com/news/2010/03/theres-no-such-thing-as-a-json ( a krucjata przeciwko obiektom JSON trwa ... )
Felix Kling
4
@Matt: Rzeczywiście. Cóż, JSON to tekstowy format danych. A cytowany kod nie byłby JSON, nawet gdyby znajdował się w ciągu znaków (ponieważ JSON wymaga podwójnych cudzysłowów w nazwach właściwości).
TJ Crowder
6
Dzięki za oświecenie mnie. Z pewnością wygląda jak obiekt JSON! Dzięki jeszcze raz!
Bug Magnet
3
Notacji JSON dla: @Bug {items: []}będzie wyglądać następująco: {"items": []}. To nie jest dokładnie to samo (po prostu bardzo podobne; znowu JSON jest podzbiorem tego, czego używasz, czyli notacją dosłowną obiektu). Podczas deserializacji JSON wynikiem jest graf obiektu (np. W JavaScript jest to obiekt JavaScript).
TJ Crowder

Odpowiedzi:

221

Po pierwsze, cytowany kod nie jest JSON. Twój kod jest notacją literału obiektu JavaScript. JSON jest podzbiorem tego, który został zaprojektowany w celu łatwiejszego analizowania.

Kod określa przedmiot ( data), zawierającą zestaw ( itemsI) przedmiotów (każdy z id, namei type).

Nie potrzebujesz ani nie chcesz do tego celu jQuery, tylko JavaScript.

Dodawanie pozycji:

data.items.push(
    {id: "7", name: "Douglas Adams", type: "comedy"}
);

To się kończy. Zobacz poniżej, aby dodać w środku.

Usuwanie przedmiotu:

Jest kilka sposobów. spliceMetoda jest najbardziej wszechstronny:

data.items.splice(1, 3); // Removes three items starting with the 2nd,
                         // ("Witches of Eastwick", "X-Men", "Ordinary People")

splice modyfikuje oryginalną tablicę i zwraca tablicę usuniętych elementów.

Dodanie w środku:

splicew rzeczywistości dodaje i usuwa. Podpis splicemetody to:

removed_items = arrayObject.splice(index, num_to_remove[, add1[, add2[, ...]]]);
  • index - indeks, od którego należy rozpocząć wprowadzanie zmian
  • num_to_remove - zaczynając od tego indeksu, usuń tyle wpisów
  • addN - ... a następnie wstaw te elementy

Mogę więc dodać element na trzeciej pozycji w ten sposób:

data.items.splice(2, 0,
    {id: "7", name: "Douglas Adams", type: "comedy"}
);

Oznacza to: zaczynając od indeksu 2, usuń zero elementów, a następnie wstaw następujący element. Wynik wygląda następująco:

var data = {items: [
    {id: "1", name: "Snatch", type: "crime"},
    {id: "2", name: "Witches of Eastwick", type: "comedy"},
    {id: "7", name: "Douglas Adams", type: "comedy"},     // <== The new item
    {id: "3", name: "X-Men", type: "action"},
    {id: "4", name: "Ordinary People", type: "drama"},
    {id: "5", name: "Billy Elliot", type: "drama"},
    {id: "6", name: "Toy Story", type: "children"}
]};

Możesz usunąć niektóre i dodać od razu:

data.items.splice(1, 3,
    {id: "7", name: "Douglas Adams", type: "comedy"},
    {id: "8", name: "Dick Francis", type: "mystery"}
);

... co oznacza: zaczynając od indeksu 1, usuń trzy wpisy, a następnie dodaj te dwa wpisy. Co skutkuje w:

var data = {items: [
    {id: "1", name: "Snatch", type: "crime"},
    {id: "7", name: "Douglas Adams", type: "comedy"},
    {id: "8", name: "Dick Francis", type: "mystery"},
    {id: "4", name: "Ordinary People", type: "drama"},
    {id: "5", name: "Billy Elliot", type: "drama"},
    {id: "6", name: "Toy Story", type: "children"}
]};
TJ Crowder
źródło
Cześć, gdybym chciał określić liczbę elementów w danych obiektu, aby móc dynamicznie definiować „id” podczas wypychania nowych elementów; jak bym to zrobił?
Hudson Atwell
@HudsonAtwell: data.itemsto tablica. Tablice mają lengthwłaściwość. :-)
TJ Crowder
Robiąc push, zawsze otrzymuję „... nie ma metody push”. Hmm ... Nie mogę dowiedzieć się, co jest nie tak ...
Sliq,
@TJCrowder, jest to możliwe do usunięcia id = 5, a także może aktualizacja namedo id=6celuToy
Mourya
jeśli obiekt JSON wymaga wypychania do obiektu json, a nie do tablicy, użyj $ .exetend, jak wspomniał Peter Drinnan poniżej stackoverflow.com/a/17976034/2466650
Sai
19

Splot jest dobry, wszyscy wyjaśniają splot, więc nie wyjaśniłem tego. Możesz także użyć słowa kluczowego delete w JavaScript, to dobrze. Możesz użyć $ .grep również do manipulowania tym za pomocą jQuery.

Sposób jQuery:

data.items = jQuery.grep(
                data.items, 
                function (item,index) { 
                  return item.id !=  "1"; 
                });

USUŃ sposób:

delete data.items[0]

Do dodania PUSH jest lepsze połączenie, ponieważ połączenie jest funkcją ciężko ważoną. Splice tworzą nową tablicę, jeśli masz ogromną tablicę, może to być kłopotliwe. delete jest czasami przydatne, po usunięciu, jeśli szukasz długości tablicy, nie ma tam żadnej zmiany długości. Więc używaj go mądrze.

Imrul
źródło
co próbujesz powiedzieć w ostatnim akapicie? Jest tak mgliście, że nic nie zrozumiałem.
Decebal
1
vode down! aby nie usuwać, po prostu utwórz niezdefiniowany powiązany indeks
13

Jeśli używasz jQuery, możesz użyć funkcji rozszerzania, aby dodać nowe elementy.

var olddata = {"fruit":{"apples":10,"pears":21}};

var newdata = {};
newdata['vegetables'] = {"carrots": 2, "potatoes" : 5};

$.extend(true, olddata, newdata);

To wygeneruje:

{"fruit":{"apples":10,"pears":21}, "vegetables":{"carrots":2,"potatoes":5}};
Peter Drinnan
źródło
8

To wcale nie jest JSON, to tylko obiekty JavaScript. JSON to tekstowa reprezentacja danych, która wykorzystuje podzbiór składni JavaScript.

Powodem, dla którego nie możesz znaleźć żadnych informacji o manipulowaniu JSON za pomocą jQuery, jest to, że jQuery nie ma nic, co mogłoby to zrobić, i generalnie nie jest to w ogóle wykonywane. Manipulujesz danymi w postaci obiektów JavaScript, a następnie zamieniasz je na ciąg JSON, jeśli tego potrzebujesz. (Jednak jQuery ma metody konwersji).

To, co masz, to po prostu obiekt, który zawiera tablicę, więc możesz wykorzystać całą wiedzę, którą już posiadasz. Po prostu użyj, data.itemsaby uzyskać dostęp do tablicy.

Na przykład, aby dodać kolejny element do tablicy przy użyciu wartości dynamicznych:

// The values to put in the item
var id = 7;
var name = "The usual suspects";
var type = "crime";
// Create the item using the values
var item = { id: id, name: name, type: type };
// Add the item to the array
data.items.push(item);
Guffa
źródło
5

Dodawanie obiektu do tablicy JSON

var arrList = [];
var arr = {};   
arr['worker_id'] = worker_id;
arr['worker_nm'] = worker_nm;
arrList.push(arr);

Usuwanie obiektu z pliku JSON

Pracuje dla mnie.

  arrList = $.grep(arrList, function (e) { 

        if(e.worker_id == worker_id) {
            return false;
        } else {
            return true;
        }
    });

Zwraca tablicę bez tego obiektu.

Mam nadzieję, że to pomoże.

Siva Anand
źródło
3

Cóż, to tylko obiekt javascript, więc możesz manipulować data.itemstak jak zwykłą tablicą. Jeśli zrobisz:

data.items.pop();

Twoja itemstablica będzie o 1 element krótsza.

Kolczasty Norman
źródło
1

Zachowaj prostotę :)

var my_form_obj = {};
my_form_obj.name = "Captain America";
my_form_obj.weapon = "Shield";

Mam nadzieję że to pomoże!

Talha
źródło
0

Próbować

data.items.pop();
data.items.push({id: "7", name: "Matrix", type: "adult"});

Kamil Kiełczewski
źródło