Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Knockout JS对象与Javascript对象合并_Javascript_Json_Knockout.js - Fatal编程技术网

将Knockout JS对象与Javascript对象合并

将Knockout JS对象与Javascript对象合并,javascript,json,knockout.js,Javascript,Json,Knockout.js,我正在尝试将一些数据作为单个对象异步发送。一半的数据来自我的knockoutjsviewmodel。另一半是我想补充的数据 我的想法是将它们都转换为JSON对象,然后使用array.concat将它们组合在一起。但这不起作用。你知道为什么吗 我试过几种解决办法。第一个方法从JSON字符串构建对象,然后使用JSON.parse将它们作为对象。第二种方法试图完全避免使用字符串。不管怎样,在我得到我的对象后,我尝试将它们连接在一起,但没有任何运气 用绳子 有物体 有对象(2) 你知道这里可能出了什么问

我正在尝试将一些数据作为单个对象异步发送。一半的数据来自我的knockoutjsviewmodel。另一半是我想补充的数据

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

我试过几种解决办法。第一个方法从JSON字符串构建对象,然后使用JSON.parse将它们作为对象。第二种方法试图完全避免使用字符串。不管怎样,在我得到我的对象后,我尝试将它们连接在一起,但没有任何运气

用绳子 有物体 有对象(2) 你知道这里可能出了什么问题吗


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

检查变量的类型:

/* 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)
返回一个不是数组的对象,您将得到大量
“没有方法concat on…”
异常。相反,您可以将它们都放入一个数组中:

[toAddObj, koObj] // and JSON.stringify that
或者使用字符串构建过程并使用

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

首选第一种方法。

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

var toAddObj = { file: 'one' };

var koObj = ko.toJS(viewModel);

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

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

ko.toJS(viewModel)会给您带来什么结果?它是数组还是对象?您是否试图以一个具有
toAddObj
koObj
组合属性的对象结束?还是你想要数组?@GregL,我更新了问题。我真的不在乎我是否得到一个数组或一个对象回来;两种方法都可以。toJS()的工作原理是创建viewModel的JSON字符串,然后在其上运行浏览器的本机序列化程序,因此它应该是一个JavaScript对象。什么不起作用?你有什么例外?+1回答得很好,Bergi。非常有启发性!我很明显把数组和对象搞混了,谢谢!我正在寻找一种叫做“extend”之类的实用方法——许多JS库都有一个,比如,可能还有其他的。它们的工作原理与淘汰赛非常相似。
[toAddObj, koObj] // and JSON.stringify that
"["+toAddString+","+koString+"]";
var toAddObj = { file: 'one' };

var koObj = ko.toJS(viewModel);

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