Есть ли встроенный метод для объединения свойств двух объектов в один объект? - PullRequest
1 голос
/ 11 июня 2009

Я ищу встроенный метод , который объединяет два ассоциативных массива или объекта в один. Использование веб-набора в Adobe Air, если это имеет значение. Но в принципе у меня есть два объекта или ассоциативных массива, если хотите:

var obj1 = { prop1: "something", prop2 "anotherthing" };
var obj2 = { prop3: "somethingelse" };

и я хочу объединить их и создать объект, который имеет все объединенные ключи и значения двух вышеупомянутых объектов:

var obj3 = obj1.merge( obj2 ); //something similar to array's concat maybe?

alert(obj3.prop1); //alerts "something"
alert(obj3.prop2); //allerts "anotherthing"
alert(obj3.prop3); //alerts "somethingelse"

Любая встроенная функция, которая делает это или я должен сделать это вручную?

Ответы [ 3 ]

5 голосов
/ 11 июня 2009

Как сказал триптих, за исключением того, что его пример кода (был опасным и неправильным, пока он не отредактировал его) что-то более похожее на следующее было бы лучше.

mylib = mylib || {};
//take objects a and b, and return a new merged object o;
mylib.merge = function(a, b) {

  var i, o = {};
  for(i in a) {
      if(a.hasOwnProperty(i)){
          o[i]=a[i];
      }
  }
  for(i in b) {
      if(b.hasOwnProperty(i)){
          o[i]=b[i];
      }
  }

  return o;

}
//take objects a and b, and modify object a to have b's properties
mylib.augment = function(a, b) {
  var i;
  for(i in b) {
      if(b.hasOwnProperty(i)){
          a[i]=b[i];
      }
  }
  return a;
}

править. Свирепый. Глубокая копия - это другая и ортогональная функция, но только для вас, вот моя личная функция глубокой копии

   function clone(o) {
    var t,i;
    if (o === undefined) {
        return undefined;
    }
    if (o === null) {
        return null;
    }
    if (o instanceof Function) {
        return o;
    }
    if (! (o instanceof Object)) {
        return o;
    } else {
        t = {};
        for (i in o) {
            /* jslint complains about this, it's correct in this case. I think. */
            t[i] = clone(o[i]);
        }
        return t;
    }
   }
4 голосов
/ 11 июня 2009

Альтернативная реализация триптиха (которая, по сути, такая же, как метод расширения Prototype):

/** returns object with properties of both object1 and object2. 
  *  if a collision occurs, properties of object1 take priority
  */
function merge(object1,object2) {
    var retObj = {};
    for (prop in object2){
        retObj[prop] = object2[prop];
    }
    for (prop in object1){
        retObj[prop] = object1[prop];
    }
    return retObj;
}

Это не изменяет прототип Object и, следовательно, не имеет существенных недостатков.

4 голосов
/ 11 июня 2009

Нет встроенного метода. Несколько библиотек предоставляют метод для выполнения того, что вы описываете.

Писать самому просто:

var merge = function(dest, source){
    // This will resolve conflicts by using the source object's properties
    for (prop in source){
        dest[prop] = source[prop];
    }
}

// Use like so
merge(obj1, obj2);

edit: больше не изменяет Object.prototype, который опасен и обычно осуждается.

...