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!

HypeZ
quelle
4
Mögliches Duplikat von Neues Element zu vorhandenem Objekt in JavaScript / jQuery
hinzufügen
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}]" 
Konstantin Dinev
quelle
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().

Sirko
quelle
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 } }
Craig MacGregor
quelle
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}}

Melvin Chipimo
quelle
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.

shift66
quelle
6
cart.push({"element":{ id: id, quantity: quantity }});
Krise
quelle
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

Thakur Karthik
quelle
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.

Pashifika
quelle
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);
user3910831
quelle
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"] }
Banzy
quelle
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;
                    });
Saad Patel
quelle
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.

Dave
quelle
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';
Ivan Ferrer
quelle
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 };
Ganesh
quelle
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


quelle
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
user8271796
quelle