2009-06-11 35 views
1

我在找一个内置的方法,它将两个关联数组或对象合并为一个。在Adobe 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" 

任何内置的功能,这样做还是我必须手动执行它?

回答

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

编辑re:凶猛。深拷贝是一个不同的,正交的功能,但只为你,这是我的个人深层复制功能

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

没有内置的方法。几个库提供了一种方法来完成你所描述的内容。

写一个自己很简单:

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,这是危险的,通常令人难以接受的。

+3

请注意这个实现。如果代码中的任何位置都有for(x in obj)循环,for循环将遍历合并函数,除非您明确地在所有循环中测试该循环。这可能不是你想要的。 – Breton 2009-06-11 03:14:11

+0

这很糟糕,纯JavaScript与大对象会很慢。太糟糕了,它不存在。有意义有这样的事情不对吧/ – 2009-06-11 03:15:10

4

一种替代实施三联的(这是基本相同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; 
} 

这并不修改对象的原型,因此不具有这不是微不足道的缺点。

相关问题