Как я могу объединить свойства двух объектов JavaScript динамически?

Мне нужно объединить два (очень простых) объекта JavaScript во время выполнения. Например, я бы хотел:

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }

obj1.merge(obj2);

//obj1 now has three properties: food, car, and animal

У кого-нибудь есть сценарий для этого или знаете встроенный способ сделать это? Мне не нужна рекурсия, и мне не нужно объединять функции, просто методы на плоских объектах.

javascript,javascript-objects,

1873

Ответов: 26


2

Ничего себе .. это первое сообщение StackOverflow, которое я видел с несколькими страницами. Извинения за добавление еще одного "ответа"

Этот метод предназначен для ES5 и ранее - есть много других ответов, касающихся ES6.

Я не видел никакого «глубокого» слияния объекта с использованием argumentsсвойства. Вот мой ответ - компактный и рекурсивный , позволяющий передавать неограниченные аргументы объекта:

function extend() {
    for (var o = {}, i = 0; i < arguments.length; i++) {
        // if (arguments[i].constructor !== Object) continue;
        for (var k in arguments[i]) {
            if (arguments[i].hasOwnProperty(k)) {
                o[k] = arguments[i][k].constructor === Object ? extend(o[k] || {}, arguments[i][k]) : arguments[i][k];
            }
        }
    }
    return o;
}

Часть, которая закомментирована, является необязательной. Она просто пропускает переданные аргументы, которые не являются объектами (предотвращая ошибки).

Пример:

extend({
    api: 1,
    params: {
        query: 'hello'
    }
}, {
    params: {
        query: 'there'
    }
});

// outputs {api: 1, params: {query: 'there'}}

Этот ответ теперь - только падение в океане ...


1

Вы можете объединить объекты, следуя моему методу

var obj1 = { food: 'pizza', car: 'ford' };
var obj2 = { animal: 'dog' };

var result = mergeObjects([obj1, obj2]);

console.log(result);
document.write("result: <pre>" + JSON.stringify(result, 0, 3) + "</pre>");

function mergeObjects(objectArray) {
    if (objectArray.length) {
        var b = "", i = -1;
        while (objectArray[++i]) {
            var str = JSON.stringify(objectArray[i]);
            b += str.slice(1, str.length - 1);
            if (objectArray[i + 1]) b += ",";
        }
        return JSON.parse("{" + b + "}");
    }
    return {};
}


1

Использование:

//Takes any number of objects and returns one merged object
var objectMerge = function(){
    var out = {};
    if(!arguments.length)
        return out;
    for(var i=0; i<arguments.length; i++) {
        for(var key in arguments[i]){
            out[key] = arguments[i][key];
        }
    }
    return out;
}

Он был протестирован с:

console.log(objectMerge({a:1, b:2}, {a:2, c:4}));

Это приводит к:

{ a: 2, b: 2, c: 4 }

1

Расширение Госси метода Дэвида Коллиера:

Проверьте эти две строки:

from = arguments[i];
Object.getOwnPropertyNames(from).forEach(function (name) {

Нужно проверить «из» на нулевой объект ... Если, например, если слияние объекта, полученного из ответа Ajax , ранее созданного на сервере, свойство объекта может иметь значение «null», и в этом случае вышеуказанное код генерирует ошибку:

«from» не является допустимым объектом

Так, например, обертывание функции «... Object.getOwnPropertyNames (from) .forEach ...» с «if (from! = Null) {...}» предотвратит эту ошибку.


1

Для тех, кто использует Node.js , есть модуль NPM: node.extend

Установка:

npm install node.extend

Применение:

var extend = require('node.extend');
var destObject = extend(true, {}, sourceObject);
// Where sourceObject is the object whose properties will be copied into another.
JavaScript, JavaScript-объекты,
Похожие вопросы