Dodawanie elementów do obiektu


222

Muszę wypełnić plik json, teraz mam coś takiego:

{"element":{"id":10,"quantity":1}}

I muszę dodać kolejny „element”. Moim pierwszym krokiem jest umieszczenie tego jsona w typie obiektu za pomocą cart = JSON.parse, teraz muszę dodać nowy element. Przypuszczam, że muszę użyć, cart.pushaby dodać kolejny element, próbowałem tego:

var element = {};
element.push({ id: id, quantity: quantity });
cart.push(element);

Ale mam błąd „Obiekt nie ma metody push”, gdy próbuję to zrobić element.push, i myślę, że robię coś BARDZO źle, ponieważ nigdzie nie mówię o „elemencie”.

Jak mogę to zrobić?

Edycja: przepraszam wszystkich Miałem wiele zamieszania w głowie.

Myślałem, że mogę uzyskać tylko typ obiektu podczas pobierania danych JSON.parse, ale w pierwszej kolejności dostaję to, co wstawiłem do JSON.

Umieszczenie tablicy zamiast obiektu rozwiązało mój problem, skorzystałem też z wielu sugestii, które tu otrzymałem, dziękuję wszystkim!



Object.assign (cel, źródło); można użyć do skopiowania wszystkich właściwości z obiektu źródłowego do obiektu docelowego.
David Spector,

Odpowiedzi:


287

Twój element nie jest tablicą, jednak koszyk musi być tablicą, aby obsługiwać wiele obiektów elementów. Przykład kodu:

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);

Jeśli chcesz, aby koszyk był tablicą obiektów w formularzu, { element: { id: 10, quantity: 1} }wykonaj następujące czynności:

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push({element: element});

JSON.stringify() został wspomniany jako problem w komentarzu:

>> JSON.stringify([{a: 1}, {a: 2}]) 
      "[{"a":1},{"a":2}]" 

2
dziękuję, ale mój koszyk nie jest już tablicą i nie mogę zrobić cart.push :( Potrzebuję obiektu, aby użyć JSON.stringify (koszyk) po tej operacji
HypeZ

@HypeZ Nadal możesz skreślić wózek, jeśli jest to tablica obiektów.
Konstantin Dinev

Jeszcze raz dziękuję! Ale moje podstawowe dane są przyczyną typu obiektu „cart = JSON.parse (jsonfile)” na początku .. nie sądzę, że powinienem brać json jako obiekt, konwertować go na tablicę, dodawać element, stringify ..
HypeZ

z jakiegoś powodu mój obiekt wypełnia się tylko ostatnim elementem. np. mam 4 różne elementy, ale w obiekcie wszystkie 4 elementy to = ostatnia wartość, którą znalazłem rozwiązanie to create element = {}; wewnątrz for, to działa poprawnie
Gorodeckij Dimitrij

1
@GorodeckijDimitrij Jeśli ponownie używasz tego samego obiektu elementu i ponownie wypełniasz jego klucze nowymi wartościami, wówczas modyfikowałbyś jedną i tę samą instancję elementu, wpychając go raz po raz do tablicy. Po prostu użyj nowego obiektu elementu dla każdego dodawanego elementu, co właśnie zrobiłeś w zakresie pętli for.
Konstantin Dinev

160

Z tym rzędem

var element = {};

definiujesz elementjako zwykły obiekt. Natywny obiekt JavaScript nie ma push()metody. Aby dodać nowe elementy do zwykłego obiektu, użyj następującej składni:

element[ yourKey ] = yourValue;

Z drugiej strony możesz zdefiniować elementtablicę za pomocą

var element = [];

Następnie możesz dodawać elementy za pomocą push().


4
element[ yourKey ] = yourValue;to najlepszy sposób na dodanie elementu do obiektu.
Pramesh Bajracharya

Ale nie można ustalić kolejności elementu dodanego w obiekcie za pomocą elementu [yourKey] = yourValue;
RollerCosta

2
@Pramesh Bajracharya Nie dodaje wartości do elementu, po prostu ustawia bieżący element na tę wartość.
Hasen

1
@sommesh, jak chcesz zachować duplikat? mogłeś zrobićelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko

1
@sommesh daje to duplikat klucza, co z definicji nie jest możliwe w obiekcie JS. możesz zebrać tylko kilka wartości dla jednego klucza, jak pokazałem wcześniej.
Sirko

21

Jeśli koszyk musi być przechowywany jako obiekt, a nie tablica (chociaż zalecałbym przechowywanie jako []), zawsze możesz zmienić strukturę, aby użyć identyfikatora jako klucza:

var element = { quantity: quantity };
cart[id] = element;

Umożliwia to dodawanie wielu elementów do koszyka, takich jak:

cart["1"] = { quantity: 5};
cart["2"] = { quantity: 10};

// Cart is now:
// { "1": { quantity: 5 }, "2": { quantity: 10 } }

dziękuję, ale mój koszyk musi być przedmiotem, a nie tablicą :(
HypeZ

3
Jednym z powodów używania takiego obiektu jest to, że musisz usunąć elementy. Usunięcie klucza z obiektu jest o wiele łatwiejsze niż usunięcie klucza z tablicy.
bryc

W przypadku, gdy komentarz tablicy HypeZ wytrąci kogoś z równowagi, odpowiedź Craiga nie dodaje tablicy, nawiasy [] służą do uzyskania dostępu do właściwości. Przetestuj to tutaj na jsfiddle i poczytaj o tym tutaj w Mozilli, a tutaj jest świetny artykuł na Digital Ocean, który chciałbym spotkać dawno temu.
Hastig Zusammenstellen

12

Aby dołączyć do obiektu, użyj Object.assign

var ElementList ={}

function addElement (ElementList, element) {
    let newList = Object.assign(ElementList, element)
    return newList
}
console.log(ElementList)

Wynik:

{„element”: {„id”: 10, „ilość”: 1}, „element”: {„id”: 11, „ilość”: 2}}


Jest to prawdopodobnie najbardziej funkcjonalny sposób robienia rzeczy, ale nowy programista javascript prawdopodobnie tego nie zrozumie.
codeninja

1
próbowałem, ale zastąpi istniejący element, ponieważ oba mają tę samą nazwę element, więc będzie miał tylko ostatni element.
Haritsinh Gohil

6

powinieneś pisać var element = [];
javascript {}jest pustym obiektem i []pustą tablicą.


6
cart.push({"element":{ id: id, quantity: quantity }});

4
nie można zrobić cart.push, ponieważ koszyk jest teraz przedmiotem! :(
HypeZ

jakiś konkretny powód, dla którego jest to obiekt, a nie tablica?
Cris,

ponieważ mam go z „koszyka = JSON.parse (jsonfile)” i daje obiekt
HypeZ

6

Czytałem coś związanego z tą próbą, jeśli jest to przydatne.

1. Zdefiniuj funkcję push wewnątrz obiektu.

let obj={push:function push(element){ [].push.call(this,element)}};

Teraz możesz przesuwać elementy takie jak tablica

obj.push(1)
obj.push({a:1})
obj.push([1,2,3])

Spowoduje to wytworzenie tego obiektu

obj={
 0: 1
 1: {a: 1}
 2: (3) [1, 2, 3]
 length: 3
}

Zauważ, że elementy są dodawane za pomocą indeksów, a także zobacz, że do obiektu dodano nową właściwość długości. Przydaje się to również do znalezienia długości obiektu. Działa to z powodu ogólnej natury push()funkcji


5
function addValueInObject(object, key, value) {
    var res = {};
    var textObject = JSON.stringify(object);
    if (textObject === '{}') {
        res = JSON.parse('{"' + key + '":"' + value + '"}');
    } else {
        res = JSON.parse('{' + textObject.substring(1, textObject.length - 1) + ',"' + key + '":"' + value + '"}');
    }
    return res;
}

ten kod działa.


3

Spróbuj tego:

var data = [{field:"Data",type:"date"},  {field:"Numero",type:"number"}];

var columns = {};

var index = 0;

$.each(data, function() {

    columns[index] = {
        field : this.field,
        type : this.type
    };

    index++;
});

console.log(columns);

3

Dodanie nowych elementów klucz / para do oryginalnego obiektu:

const obj = { a:1, b:2 }
const add = { c:3, d:4, e: ['x','y','z'] }

Object.entries(add).forEach(([key,value]) => {obj[key] = value })

obj nowa wartość:

{a: 1, b: 2, c: 3, d: 4, e: ["x", "y", "z"] }

2

Jeśli ktoś chce stworzyć podobny JSON, tylko bez użycia cartjako tablicy, oto:

Mam szereg obiektów, takich myArrjak:

var myArr = [{resourceType:"myRT",
            id: 1,
            value:"ha"},
            {resourceType:"myRT",
            id: 2,
            value:"he"},
            {resourceType:"myRT",
            id: 3,
            value:"Li"}];

i spróbuję utworzyć JSON o następującej strukturze:

{
 "1":{"resourceType":"myRT","id":"1","value":"ha"},
 "2":{"resourceType":"myRT","id":"2","value":"he"},
 "3":{"resourceType":"myRT","id":"3","value":"Li"}
}

możesz po prostu zrobić

var cart = {};
myArr.map(function(myObj){
                    cart[myObj.id]= myObj;
                    });

Jak dodać wartość do nowej struktury JSON, którą utworzyłeś?
Jude Fernandes,

1
@JudeFernandes to w cart[key]=valuezasadzie mapa kluczowych wartości. Nie głosuj, jeśli odpowiedź była pomocna. Dzięki!
Saad Patel,

2

Dla każdego, kto wciąż szuka rozwiązania, uważam, że obiekty powinny były być przechowywane w tablicy takiej jak ...

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);

Jeśli chcesz użyć elementu jako obiektu, możesz to zrobić ...

var element = cart.find(function (el) { return el.id === "id_that_we_want";});

Ustaw zmienną na „id_that_we_want” i podaj identyfikator elementu, który chcemy z naszej tablicy. Zwracany jest obiekt „elemnt”. Oczywiście nie musimy nam identyfikować obiektu. Do znalezienia moglibyśmy użyć innej właściwości.


1
 function addValueInObject(value, object, key) {

        var addMoreOptions = eval('{"'  + key + '":' +  value + '}');

        if(addMoreOptions != null) {
            var textObject = JSON.stringify(object);
            textObject = textObject.substring(1,textObject.length-1);
            var AddElement = JSON.stringify(addMoreOptions);
            object = eval('{' + textObject +','+  AddElement.substring(1,AddElement.length-1) + '}');
        }
        return object;
    }

addValueInObject('sdfasfas', yourObject, 'keyname');

LUB:

var obj = {'key':'value'};

obj.key2 = 'value2';

Chociaż jest to sposób na osiągnięcie tych samych rezultatów, to rozwiązanie nie jest fajne.
warunapww

1

push jest metodą tablic, więc dla obiektu możesz uzyskać indeks ostatniego elementu i prawdopodobnie możesz wykonać tę samą pracę, co push dla obiektu jak poniżej

var lastIndex = Object.keys(element)[Object.keys(element).length-1];

następnie dodaj obiekt do nowego indeksu elementu

element[parseInt(lastIndex) +1] = { id: id, quantity: quantity };

1

jeśli nie planujesz zrobić pętli w JS, np. przejdź do PHP, aby zrobić pętlę dla ciebie

let decision = {}
decision[code+'#'+row] = event.target.value

ta koncepcja może trochę pomóc


1

To stare pytanie, a dzisiaj najlepszą praktyką jest użycie Object.defineProperty

const object1 = {};

Object.defineProperty(object1, 'property1', {
  value: 42,
  writable: false
});

object1.property1 = 77;
// throws an error in strict mode

console.log(object1.property1);
// expected output: 42
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.