将Knockout JS对象与Javascript对象合并

时间:2012-12-19 23:56:27

标签: javascript json knockout.js

我正在尝试异步发送一些数据作为单个对象。一半的数据来自我的KnockoutJS viewModel。另一半是我想要添加的一些数据。

我的想法是将它们都转换为JSON对象,然后使用数组.concat将它们放在一起。但这不起作用。你知道为什么吗?

我尝试了一些解决方案。第一种方法从JSON字符串构建对象,然后使用JSON.parse将它们作为对象。第二个尝试完全避免字符串。无论哪种方式,在我得到我的对象后,我尝试将它们连接在一起,但没有任何运气。

使用字符串

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

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

finalObj = koObj.concat(toAddObj);

使用对象

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

koObj = ko.toJS(viewModel);

finalObj = koObj.concat(toAddObj);

使用对象(2)

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

koObj = ko.toJS(viewModel);

finalObj = koObj.concat(toAddObj);

你知道这里可能出了什么问题吗?

我想要的只是一个对象,无论是数组还是JSON对象,它包含来自每个源的数据。

2 个答案:

答案 0 :(得分:7)

尝试以下方法。我在猜测语法,因为我自己不使用Knockout,而且我使用ko.utils.extend()函数将一个对象的属性复制到另一个对象上。

var toAddObj = { file: 'one' };

var koObj = ko.toJS(viewModel);

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

请注意,如果不使用var,您始终会创建全局变量(通常是个坏主意)。

答案 1 :(得分:2)

检查变量的类型:

/* 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?

因此,如果ko.toJS(viewModel)返回一个不是数组的对象,您将获得大量"no method concat on …"个异常。相反,你可以将它们都放入一个数组中:

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

或者您使用字符串构建过程并使用

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

第一种方法更可取。