2010-09-07 119 views
5

是否有任何現有的方法將對象追加到另一個對象?將對象追加到現有對象

我已經在這個扔一起快速刺,但我不知道兩件事情:

  • 上午我正確的處理方法?我爲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); 

回答

2

我喜歡它。我在我的代碼中使用了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

3

你忘了「布爾」作爲

typeof true 
+0

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

+0

同意..不知道我是如何錯過的;)還編輯了原始問題=] – kwah 2010-09-07 19:17:25