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

Как конкатенировать свойства из нескольких объектов JavaScript

Я ищу лучший способ "добавить" несколько объектов JavaScript (ассоциативные массивы).

Например, данный:

a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };

как лучше всего вычислить:

{ "one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }
4b9b3361

Ответ 1

В ECMAscript 6 введено Object.assign(), чтобы добиться этого в Javascript.

Метод Object.assign() используется для копирования значений всех перечислимых собственных свойств из одного или нескольких исходных объектов в целевой объект. Он вернет целевой объект.

Документация MDN по Object.assign()

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }

Object.assign поддерживается во многих современных браузерах, но еще не все из них. Используйте транспилер, например Babel и Traceur для создания обратного совместимого ES5 JavaScript.

Ответ 3

Это должно сделать это:

function collect() {
  var ret = {};
  var len = arguments.length;
  for (var i=0; i<len; i++) {
    for (p in arguments[i]) {
      if (arguments[i].hasOwnProperty(p)) {
        ret[p] = arguments[i][p];
      }
    }
  }
  return ret;
}

Input:

a = { "one" : 1, "two" : 2 };
b = { "three" : 3 };
c = { "four" : 4, "five" : 5 };
d = collect(a, b, c);
console.log(d);

Вывод:

Object one=1 two=2  three=3 four=4 five=5

Ответ 4

Underscore имеет несколько методов для этого:

1. _. extend (destination, * sources)

Скопируйте все свойства объектов source в объект целевой и верните объект целевой.

_.extend(a, _.extend(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

или

_.extend(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.extend(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

2. _. defaults (объект, * по умолчанию)

Заполните свойства undefined в объекте со значениями из объектов по умолчанию и верните объект.

_.defaults(a, _.defaults(b, c));
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

или

_.defaults(a, b);
=> {"one" : 1, "two" : 2, "three" : 3}
_.defaults(a, c);
=> {"one" : 1, "two" : 2, "three" : 3, "four" : 4, "five" : 5 }

Ответ 5

function Collect(a, b, c) {
    for (property in b)
        a[property] = b[property];

    for (property in c)
        a[property] = c[property];

    return a;
}

Примечание. Существующие свойства предыдущих объектов будут перезаписаны.

Ответ 6

В ECMAScript 6 есть оператор распространения. И теперь вы можете сделать это:

const obj1 = {1: 11, 2: 22}
const obj2 = {3: 33, 4: 44}
const obj3 = {...obj1, ...obj2} 
console.log(obj3)

// {1: 11, 2: 22, 3: 33, 4: 44}

Ответ 7

Почему функция должна быть ограничена тремя аргументами? Также проверьте hasOwnProperty.

function Collect() {
    var o={};
    for(var i=0;i<arguments.length;i++) {
      var arg=arguments[i];
      if(typeof arg != "object") continue;
      for(var p in arg) {
        if(arg.hasOwnProperty(p)) o[p] = arg[p];
      }
    }
    return o;
}

Ответ 8

function collect(a, b, c){
    var d = {};

    for(p in a){
        d[p] = a[p];
    }
    for(p in b){
        d[p] = b[p];
    }
    for(p in c){
        d[p] = c[p];
    }

    return d;
}

Ответ 9

Возможно, самым быстрым, эффективным и более общим способом является это (вы можете объединить любое количество объектов и даже скопировать на первый → назначить):

function object_merge(){
    for (var i=1; i<arguments.length; i++)
       for (var a in arguments[i])
         arguments[0][a] = arguments[i][a];
   return arguments[0];
}

Он также позволяет вам изменять первый объект по мере его передачи по ссылке. Если вы не хотите этого, но хотите иметь совершенно новый объект, содержащий все свойства, вы можете передать {} в качестве первого аргумента.

var object1={a:1,b:2};
var object2={c:3,d:4};
var object3={d:5,e:6};
var combined_object=object_merge(object1,object2,object3); 

shared_object и object1 оба содержат свойства объекта1, object2, object3.

var object1={a:1,b:2};
var object2={c:3,d:4};
var object3={d:5,e:6};
var combined_object=object_merge({},object1,object2,object3); 

В этом случае объединенный_объект содержит свойства объекта1, object2, object3, но object1 не изменяется.

Отметьте здесь: https://jsfiddle.net/ppwovxey/1/

Примечание. Объекты JavaScript передаются по ссылке.

Ответ 10

Я также написал этот объект-merge повторно используемый компонент, который также полагается на Object.assign, чтобы объединить несколько объектов, не изменяя их, и может быть повторное использование без дублирования

Пример:

const o1 = { a: 1 };
const o2 = { b: 2 };
const o3 = { c: 3 };

const obj = merge(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1 } does not mutate objects

(Также добавлены тесты).