将对象追加到现有对象

问题描述:

是否有任何现有的方法将对象追加到另一个对象?将对象追加到现有对象

我已经在这个扔一起快速刺,但我不知道两件事情:

  • 上午我正确的处理方法?我为append添加了一个异常,但当其他原型函数存在时呢?我应该忽略新课堂中的功能吗?

  • 我该如何处理null/undefined值?

  • 另外,我刚刚考虑过数组..什么是处理数组的最佳方式?作为typeof运算“对象”的报告。我猜测试阵列()构造函数值将是前进的道路

比这两个问题似乎充当我希望它其他(覆盖/添加现有对象的各个部分只存在于新对象中)。有没有我错过的边缘案例?

Object.prototype.append = function(_newObj) 
{ 
    if('object' !== typeof _newObj) { 
    console.info("ERROR!\nObject.prototype.append = function(_newObj)\n\n_newObj is not an Object!"); 
    } 

    for (newVar in _newObj) 
    { 
    switch(typeof _newObj[newVar]){ 
     case "string": 
     //Fall-through 
     case "boolean": 
     //Fall-through 
     case "number": 
     this[newVar] = _newObj[newVar]; 
     break; 

     case "object": 
     this[newVar] = this[newVar] || {}; 
     this[newVar].append(_newObj[newVar]); 
     break; 

     case "function": 
     if(newVar !== 'append'){ 
      this[newVar] = _newObj[newVar]; 
     } 
     break; 
    } 
    } 

    return this; 

} 


var foo = { 1:'a', 2:'b', 3:'c' }; 
var bar = { z: 26, y: 25, x: 24, w: { 'foo':'bar'}, v: function(){ alert('Hello world"'); } }; 

foo.append(bar); 
console.info(foo); 

我喜欢它。我在我的代码中使用了a similar, but not as robust method。但是,它可能会更安全,实现它作为Object类的静态方法:

if (typeof Object.merge !== 'function') { 
    Object.merge = function(_obj, _newObj) 
    { 
     if("object" !== typeof _obj) 
      console.info("ERROR!\nObject.merge = function(_obj, _newObj)\n\n_obj is not an Object!"); 
     if("object" !== typeof _newObj) 
      console.info("ERROR!\nObject.merge = function(_obj, _newObj)\n\n_newObj is not an Object!"); 

     for (newVar in _newObj) 
     { 
      switch(typeof _newObj[newVar]){ 
       case "object": 
        _obj[newVar] = _obj[newVar] || {}; 
        Object.merge(_obj[newVar], _newObj[newVar]); 
        break; 
       case "undefined": break; 
       default: // This takes care of "string", "number", etc. 
        _obj[newVar] = _newObj[newVar]; 
        break; 
      } 
     } 
     return _obj; 
    } 
} 

var foo = { 1:'a', 2:'b', 3:'c' }; 
var bar = { z: 26, y: 25, x: 24, w: { 'foo':'bar'}, v: function(){ alert('Hello world"'); } }; 
Object.merge(foo, bar); 
console.info(foo); 

要回答你的问题,我还没有发现任何更好的方法(框架之外),要么做到这一点。对于空值/未定义值,如果_newObj具有空值/未定义值,那么您的收件人对象是否也具有这些值(即不要为此设置任何特殊情况)?

+0

此举意(后来)合并'存储值'和'新获得'的值,它担心我可能会无意中覆盖超过30天以上收集的数据,如果脚本出于任何原因发生故障(空带有不良数据的'新对象'),所以要回答你接收者对象是否也必须具有这些:不是必需的arily .. – kwah 2010-09-07 19:30:04

+0

是的,根据你的需要,你将不得不考虑那些。我在我的代码中占了'undefined'',但不是'null'。 – palswim 2010-09-07 19:50:56

你忘了“布尔”作为

typeof true 
+0

好抓;我现在在回答中处理它。 – palswim 2010-09-07 19:00:04

+0

同意..不知道我是如何错过的;)还编辑了原始问题=] – kwah 2010-09-07 19:17:25

大多数JS库有一个方法来做到这一点,jQuery就有$.extend(dest, src[, src2 ...]),该方法的源代码可以在这里找到:http://github.com/jquery/jquery/blob/116f3b7c72004f3173a7d92457154a1fdb2180e1/src/core.js#L294