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