Подтвердить что ты не робот

Слияние двух json-объектов с jquery

У меня есть два json-объекта:

http://example.com/search.json?section=saloon

и

http://example.com/search.json?section=coupe

Я искал способ объединить эти два объекта в один объект.

Спасибо заранее.

4b9b3361

Ответ 1

использовать extend

var object = $.extend({}, object1, object2);

передавая пустой объект в качестве целевого (первого) аргумента, вы можете сохранить оба объекта, если вы хотите объединить второй объект, который вы можете сделать, например

$.extend(object1, object2);

DEMO

Ответ 2

Ну, как только ваш 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}

DEMO

Изменить: Как упоминалось 3nigma, если вы используете jQuery, вам лучше использовать $.extend. Не забудьте сначала передать пустой объект, если вы не хотите изменять существующие объекты.

Ответ 3

Все они перезаписывают весь объект, даже если одно свойство отличается, если вы хотите добавить объекты с новыми свойствами и перезаписать только листья JSON, тогда используйте это.

DEMO

//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;
}

Ответ 4

Вы можете использовать merge

var mergedObj = $.merge(jsonObj1, jsonObj2);