Hinzufügen von Elementen zum Objekt


222

Ich muss eine JSON-Datei füllen, jetzt habe ich so etwas:

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

Und ich muss ein weiteres "Element" hinzufügen. Mein erster Schritt ist das Einfügen dieses JSON in einen Objekttyp mit cart = JSON.parse. Jetzt muss ich das neue Element hinzufügen. Ich nahm an, ich muss ein cart.pushweiteres Element hinzufügen. Ich habe Folgendes versucht:

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

Aber ich habe die Fehlermeldung "Objekt hat keinen Methoden-Push" erhalten, wenn ich es versuche element.push, und ich denke, ich mache etwas SEHR Falsches, weil ich das "Element" nirgendwo erzähle.

Wie kann ich das machen?

Edit: Entschuldigung an alle, ich hatte viel Verwirrung in meinem Kopf.

Ich dachte, ich kann nur den Objekttyp abrufen, wenn ich Daten entnehme JSON.parse, aber ich bekomme zuerst das, was ich in den JSON eingefügt habe.

Das Setzen eines Arrays anstelle eines Objekts hat mein Problem gelöst. Ich habe auch hier viele Vorschläge verwendet. Vielen Dank an alle!



Object.assign (Ziel, Quelle); kann verwendet werden, um alle Eigenschaften von einem Quellobjekt in ein Zielobjekt zu kopieren.
David Spector

Antworten:


287

Ihr Element ist kein Array, Ihr Warenkorb muss jedoch ein Array sein, um viele Elementobjekte zu unterstützen. Codebeispiel:

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

Wenn der Warenkorb ein Array von Objekten im Formular sein soll, { element: { id: 10, quantity: 1} }führen Sie folgende Schritte aus:

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

JSON.stringify() wurde als Anliegen in dem Kommentar erwähnt:

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

2
Vielen Dank, aber mein Warenkorb ist jetzt kein Array und ich kann den cart.push nicht ausführen :( Ich benötige ein Objekt, um JSON.stringify (cart) nach dieser Operation zu verwenden
HypeZ

@HypeZ Sie können den Warenkorb weiterhin als String festlegen, wenn es sich um ein Array von Objekten handelt.
Konstantin Dinev

Danke nochmal! Aber meine Basisdaten sind Objekttyp Ursache der "cart = JSON.parse (jsonfile)" am Anfang .. Ich denke nicht, ich sollte den json als Objekt nehmen, es in Array konvertieren, Element hinzufügen, stringify ..
HypeZ

Aus irgendeinem Grund wird mein Objekt nur mit dem letzten Element gefüllt. zB habe ich 4 verschiedene Elemente, aber in einem Objekt sind alle 4 Elemente = letzte Wertlösung, die ich gefunden habe, ist create element = {}; innerhalb von für, dann seine Arbeit richtig
Gorodeckij Dimitrij

1
@GorodeckijDimitrij Wenn Sie dasselbe Elementobjekt wiederverwenden und seine Schlüssel mit neuen Werten neu füllen, ändern Sie ein und dieselbe Instanz des Elements und verschieben es immer wieder in ein Array. Verwenden Sie einfach ein neues Elementobjekt für jedes Element, das Sie hinzufügen. Dies haben Sie im Rahmen einer for-Schleife getan.
Konstantin Dinev

160

Mit dieser Reihe

var element = {};

Sie definieren element, um ein einfaches Objekt zu sein. Das native JavaScript-Objekt hat keine push()Methode. Verwenden Sie diese Syntax, um einem einfachen Objekt neue Elemente hinzuzufügen:

element[ yourKey ] = yourValue;

Auf der anderen Seite können Sie mit elementals Array definieren

var element = [];

Dann können Sie Elemente mit hinzufügen push().


4
element[ yourKey ] = yourValue;ist der beste Weg, einem Objekt ein Element hinzuzufügen.
Pramesh Bajracharya

Sie können jedoch die Reihenfolge des im Objekt hinzugefügten Elements mit element [yourKey] = yourValue nicht festlegen.
RollerCosta

2
@Pramesh Bajracharya Es werden dem Element keine Werte hinzugefügt, sondern nur das aktuelle Element auf diesen Wert gesetzt.
Hasen

1
@sommesh wie willst du das Duplikat behalten? Sie könnten tunelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko

1
@sommesh Dies würde Ihnen einen doppelten Schlüssel geben, der per Definition in einem JS-Objekt nicht möglich ist. Sie können nur mehrere Werte für einen Schlüssel erfassen, wie ich zuvor gezeigt habe.
Sirko

21

Wenn der Einkaufswagen als Objekt und nicht als Array gespeichert werden muss (obwohl ich das Speichern als [] empfehlen würde), können Sie die Struktur jederzeit ändern, um die ID als Schlüssel zu verwenden:

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

Auf diese Weise können Sie mehrere Artikel wie folgt in den Warenkorb legen:

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

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

Danke, aber mein Wagen muss ein Objekt und kein Array sein :(
HypeZ

3
Ein Grund für die Verwendung eines solchen Objekts besteht darin, dass Sie Elemente löschen müssen. Das Löschen eines Schlüssels aus einem Objekt ist viel einfacher als das Löschen eines Schlüssels aus einem Array.
Bryc

Falls der Array-Kommentar von HypeZ jemanden abschreckt, fügt Craigs Antwort kein Array hinzu, die Klammern [] werden verwendet, um auf die Eigenschaft zuzugreifen. Testen Sie es hier auf jsfiddle und lesen Sie es hier bei Mozilla. Hier ist ein großartiger Artikel bei Digital Ocean , den ich mir vor langer Zeit gewünscht habe.
Hastig Zusammenstellen

12

Zum Anhängen an ein Objekt verwenden Object.assign

var ElementList ={}

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

Ausgabe:

{"Element": {"ID": 10, "Menge": 1}, "Element": {"ID": 11, "Menge": 2}}


Dies ist wahrscheinlich die funktionalste Art, Dinge zu tun, aber ein neuer Javascript-Entwickler wird dies wahrscheinlich nicht verstehen.
Codeninja

1
Ich habe es versucht, aber es wird vorhandenes Element überschreiben, da beide den gleichen Namen haben element, so dass es nur das letzte Element hat.
Haritsinh Gohil

6

Sie sollten var element = [];
in Javascript schreiben, {}ist ein leeres Objekt und []ist ein leeres Array.


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

4
kann nicht cart.push machen, weil cart jetzt ein Objekt ist! :(
HypeZ

Gibt es einen bestimmten Grund, warum es sich eher um ein Objekt als um ein Array handelt?
Krise

weil ich es von "cart = JSON.parse (jsonfile)" bekommen habe und es ein Objekt gibt
HypeZ

6

Ich habe etwas im Zusammenhang mit diesem Versuch gelesen, wenn es nützlich ist.

1. Definieren Sie eine Push-Funktion innerhalb eines Objekts.

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

Jetzt können Sie Elemente wie ein Array verschieben

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

Dadurch wird dieses Objekt erzeugt

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

Beachten Sie, dass die Elemente mit Indizes hinzugefügt werden und dass dem Objekt eine neue Längeneigenschaft hinzugefügt wurde. Dies ist nützlich, um auch die Länge des Objekts zu ermitteln. Dies funktioniert aufgrund der generischen Natur der push()Funktion


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;
}

Dieser Code wird bearbeitet.


3

Versuche dies:

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

Hinzufügen neuer Schlüssel- / Paarelemente zum ursprünglichen Objekt:

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 neuer Wert:

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

2

Wenn jemand einen ähnlichen JSON erstellen möchte, ohne ihn cartals Array zu verwenden, gehen Sie wie folgt vor :

Ich habe eine Reihe von Objekten myArrals:

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

und ich werde versuchen, einen JSON mit der folgenden Struktur zu erstellen:

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

Sie können einfach tun-

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

Wie können Sie der von Ihnen erstellten neuen JSON-Struktur einen Wert hinzufügen?
Jude Fernandes

1
@JudeFernandes ist im cart[key]=valueGrunde eine Schlüsselwertkarte. Stimmen Sie ab, wenn die Antwort hilfreich war. Vielen Dank!
Saad Patel

2

Für alle, die noch nach einer Lösung suchen, denke ich, dass die Objekte in einem Array wie ...

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

Wenn Sie dann ein Element als Objekt verwenden möchten, können Sie dies tun ...

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

Setzen Sie eine Variable auf "id_that_we_want" und geben Sie ihr die ID des Elements, das wir von unserem Array erwarten. Ein "elemnt" -Objekt wird zurückgegeben. Natürlich müssen wir uns nicht ausweisen, um das Objekt zu finden. Wir könnten jede andere Eigenschaft verwenden, um den Fund durchzuführen.


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');

ODER:

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

obj.key2 = 'value2';

Dies ist zwar ein Weg, um die gleichen Ergebnisse zu erzielen, aber diese Lösung ist nicht ordentlich.
Warunapww

1

push ist eine Methode für Arrays, sodass Sie für Objekte den Index des letzten Elements abrufen und wahrscheinlich den gleichen Job wie push für Objekt wie unten ausführen können

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

Fügen Sie dann dem neuen Index des Elements ein Objekt hinzu

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

1

Wenn Sie nicht planen, eine Schleife in JS zu erstellen, übergeben Sie diese an PHP, um eine Schleife für Sie zu erstellen

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

Dieses Konzept kann ein bisschen helfen


1

Dies ist eine alte Frage, jedenfalls wird heute die Verwendung von Object.defineProperty empfohlen

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.