1

我正在寻找一种将两个关联数组或对象组合成一个的内置方法。如果有不同,请在 Adob​​e Air 中使用 webkit。但基本上我有两个对象或关联数组,如果你愿意的话:

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"

有任何内置功能可以做到这一点,还是我必须手动做到这一点?

4

3 回答 3

5

就像 tryptych 所说的那样,除了他的示例代码(在他编辑之前是危险和错误的)。更像下面的东西会更好。

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;
    }
   }
于 2009-06-11T03:24:53.947 回答
4

没有内置方法。几个库提供了一种方法来执行您所描述的操作。

自己写一个很简单:

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);

编辑:不再修改 Object.prototype,这是危险的,通常不受欢迎。

于 2009-06-11T03:08:10.207 回答
4

Triptych 的替代实现(与 Prototype 的 extend 方法基本相同)是:

/** 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 的原型,因此没有它不是微不足道的缺点。

于 2009-06-11T03:24:40.907 回答