2010-09-07 19 views
5

¿Hay algún método existente para agregar un objeto a otro objeto?Agregar objetos a objetos existentes

que he tenido una puñalada rápida a tirar esto juntos pero no estoy seguro acerca de un par de cosas:

  • I Am métodos de manipulación correctamente? Agregué una excepción para agregar, pero ¿qué ocurre cuando existen otras funciones de prototipo? ¿Debería simplemente ignorar funciones en la nueva clase?

  • ¿Qué debo hacer con los valores nulos/indefinidos?

  • Además, he pensado en las matrices ... ¿cuál sería la mejor forma de manejar las matrices? typeof informes como 'objeto' .. supongo que probar el Array(). constructor de datos sería el camino a seguir

Aparte de estas dos cuestiones que parece funcionar como yo quiero que (sobrescribir/añadir partes individuales del objeto existente solo donde existe en el nuevo objeto). ¿Hay algún caso marginal que me haya perdido?

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

Respuesta

2

Me gusta. He usado a similar, but not as robust method en mi código. Pero probablemente sería más seguro para implementarlo como un método estático de la clase del objeto:

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

para responder a sus preguntas, no he encontrado ningún método mejor (fuera de un marco) para hacer esto tampoco. Para valores nulos/indefinidos, si el _newObj tiene valores nulos/indefinidos, ¿no debería el objeto receptor también tenerlos (es decir, no hacer ningún caso especial para ellos)?

+0

Con ello se pretende (más adelante) para fusionar 'valores almacenados' y 'valores recién obtenidos' y me preocupa que pueda sobrescribir accidentalmente una matriz de datos recopilados durante más de 30 días en a con nulo/indefinido si la secuencia de comandos fallara por alguna razón (relleno el 'nuevo objeto' con datos incorrectos), para responderle si el objeto receptor también debe tener los siguientes: no es necesario arily .. – kwah

+0

Sí, dependiendo de sus necesidades, tendrá que dar cuenta de eso en ese momento. He contabilizado '' undefined '' en mi código, pero no 'null'. – palswim

3

se le olvidó "booleano" como en

typeof true 
+0

Buena captura; Lo he manejado en mi respuesta ahora. – palswim

+0

De acuerdo ... no estoy seguro de cómo me perdí eso;) También edité la pregunta original =] – kwah

Cuestiones relacionadas