【发布时间】:2011-12-12 17:27:24
【问题描述】:
我有两个 json 对象:
http://example.com/search.json?section=saloon
和
http://example.com/search.json?section=coupe
我一直在寻找将这两个对象组合成一个对象的方法。
提前致谢。
【问题讨论】:
标签: jquery ajax json object merge
我有两个 json 对象:
http://example.com/search.json?section=saloon
和
http://example.com/search.json?section=coupe
我一直在寻找将这两个对象组合成一个对象的方法。
提前致谢。
【问题讨论】:
标签: jquery ajax json object merge
【讨论】:
好吧,一旦您的 JSON 被提取和解析,您就可以遍历属性并将它们添加到一个新对象中。但要小心,如果有同名的属性,它们将被覆盖。
var data1 = '{"foo": 123, "test":"foo"}';
var data2 = '{"bar": 456, "test":"bar"}';
var json1 = JSON.parse(data1);
var json2 = JSON.parse(data2);
var merged = {};
for(var i in json1) {
if (json1.hasOwnProperty(i))
merged[i] = json1[i];
}
for(var i in json2) {
if (json2.hasOwnProperty(i))
merged[i] = json2[i];
}
console.log(merged);
合并后的 JSON 对象将是:
{foo: 123, test: "bar", bar: 456}
编辑: As 3nigma mentioned,如果你使用 jQuery,你最好使用 $.extend。如果您不想修改现有对象,请不要忘记先传递一个空对象。
【讨论】:
你可以使用合并
var mergedObj = $.merge(jsonObj1, jsonObj2);
【讨论】:
$.extend。
所有这些都会覆盖整个对象,即使一个属性不同,如果您想附加具有新属性的对象并仅覆盖 JSON 的叶子,请使用它。
//smart not to delete entire object if a property is different, (unlike $.extend or _.extend)
// {"a":{"b":"c", "e":"f"}},{"a":{"b":"x"}} -> {"a":{"b":"x", "e":"f"}} not {"a":{"b":"x"}}
//obj1 is not effected,
//obj1 values are overwriten at leaves of obj2
// smartJSONextend({"a":{"b":"c"}},{"a":"d"}) - {"b":"c"} will be "d"
function smartJSONextend(obj1, obj2) {
//clone
var mergedObj = JSON.parse(JSON.stringify(obj1));
(function recurse(currMergedObj, currObj2){
var key;
for (key in currObj2) {
if (currObj2.hasOwnProperty( key )){
//keep path alive in mergedObj
if (!currMergedObj[key]){
currMergedObj[key] = undefined;
}
if ( typeof currObj2[key] === "string" || typeof currObj2[key] === "number" || typeof currObj2[key] === "boolean" ){
//overwrite if obj2 is leaf and not nested
currMergedObj[key] = currObj2[key];
} else if (typeof currObj2[key] === "object"){
//obj2 is nested
//and currMergedObj[key] is undefined, sync types
if (!currMergedObj[key]) {
//obj2[key] ifArray
if(currObj2[key].length !== undefined){
currMergedObj[key] = [];
} else {
currMergedObj[key] = {};
}
}
recurse(currMergedObj[key], currObj2[key]);
}
}
}
}(mergedObj, obj2));
return mergedObj;
}
【讨论】:
感谢拉菲。
如果你想在数组中扩展一个对象,完全可以,这是我的例子:
$(document).ready(function() {
$(document).on("click", ".btnClassClose", function () {
var tinyMCEcontent = tinymce.activeEditor.getContent();
var getAttrIDArray = [];
$("#" + getelementId).html("");
$("#" + getelementId).html(tinyMCEcontent);
$("#" + getelementId).append(buttonEDI);
var PageName = new Object();
PageName["mdlPageContentHtml"] = tinyMCEcontent;
var getarraylist = JSON.parse($("#" + getelementId).attr('data-atrrib'));
var obj = $.extend({}, getarraylist, PageName);
getAttrIDArray.push(obj);
var contentGetAttrIDArray = SecondMainSendAjax("CMS?handler=Content", getAttrIDArray);
});
});
【讨论】: