5 Stimmen

Knockout JS-Objekt mit Javascript-Objekt zusammenführen

Ich versuche, einige Daten asynchron als ein einzelnes Objekt zu senden. Die Hälfte der Daten kommt von meinem KnockoutJS viewModel. Die andere Hälfte ist einige Daten, die ich auf, dass hinzufügen möchten.

Mein Gedanke war, sie beide in JSON-Objekte zu konvertieren, dann verwenden Sie ein Array .concat, um sie zusammen zu setzen. Aber das funktioniert nicht. Könnten Sie wissen, warum?

Ich habe ein paar Lösungen ausprobiert. Die erste Methode erstellt ein Objekt aus einer JSON-Zeichenkette und verwendet dann JSON.parse, um sie in ein Objekt zu verwandeln. Die zweite versucht, Strings ganz zu vermeiden. So oder so, nachdem ich meine Objekte erhalte, versuche ich, sie miteinander zu verknüpfen, aber ohne Erfolg.

Mit Streichern

toAddString = '{"file": "thefile"}';
toAddObj = JSON.parse(toAddString);

koString = ko.toJSON(viewModel);
koObj = JSON.parse(koString,null,2);

finalObj = koObj.concat(toAddObj);

Mit Objekten

toAddObj = [{"file": "thefile"}];

koObj = ko.toJS(viewModel);

finalObj = koObj.concat(toAddObj);

Mit Objekten (2)

toAddObj = new Object();
toAddObj.file = "one";

koObj = ko.toJS(viewModel);

finalObj = koObj.concat(toAddObj);

Wissen Sie, was hier schief laufen könnte?

Alles, was ich will, ist ein einziges Objekt, sei es ein Array oder ein JSON-Objekt, das die Daten aus jeder dieser Quellen enthält.

7voto

GregL Punkte 34663

Versuchen Sie das Folgende. Ich schätze die Syntax, da ich Knockout selbst nicht verwende, und ich verwende die ko.utils.extend() um die Eigenschaften des einen Objekts auf das andere zu kopieren.

var toAddObj = { file: 'one' };

var koObj = ko.toJS(viewModel);

var finalObj = ko.utils.extend(toAddObj, koObj);

Beachten Sie, dass ohne die Verwendung von var erstellen Sie immer globale Variablen (normalerweise eine schlechte Idee).

2voto

Bergi Punkte 565633

Überprüfen Sie die Typen Ihrer Variablen:

/* With Strings */
toAddString = '{"file": "thefile"}'; // a string
toAddObj = JSON.parse(toAddString); // an object

koString = ko.toJSON(viewModel); // a string containing JSON
koObj = JSON.parse(koString,null,2); // an object
                                     // notice JSON.parse does only take one argument

finalObj = koObj.concat(toAddObj); // you're calling the array concat method?

/* With Objects */
toAddObj = [{"file": "thefile"}]; // an object (represented in code as literal)

koObj = ko.toJS(viewModel); // an object

finalObj = koObj.concat(toAddObj); // you're calling the array concat method?

/* With Objects (2) */
toAddObj = new Object(); // an object
toAddObj.file = "one"; // with a string property

koObj = ko.toJS(viewModel); // an object

finalObj = koObj.concat(toAddObj); // you're calling the array concat method?

Also, wenn ko.toJS(viewModel) ein Objekt zurückgibt, das kein Array ist, erhalten Sie eine Vielzahl von "no method concat on …" Ausnahmen. Stattdessen könnten Sie einfach beide in ein Array packen:

[toAddObj, koObj] // and JSON.stringify that

oder Sie verwenden ein Verfahren zur Erstellung von Zeichenketten und verwenden

"["+toAddString+","+koString+"]";

wobei die erste Methode vorzuziehen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X