2012-03-26 11 views
9

¿Existe alguna forma eficiente de clonar un objeto pero omitiendo las propiedades especificadas? ¿Idealmente sin reescribir la función $ .extend?

var object = { 
    "foo": "bar" 
    , "bim": Array [1000] 
}; 

// extend the object except for the bim property 
var clone = $.extend({}, object, "bim"); 
// = { "foo":"bar" } 

Mi objetivo es ahorrar recursos al no copiar algo que no voy a usar.

+1

¿Qué ocurre al deshacer esas propiedades después? –

+0

Puedo hacer eso, es solo que preferiría no perder el tiempo y los recursos para copiar la propiedad. Por ejemplo, si el valor de una determinada propiedad es una gran matriz, preferiría no copiarlo en absoluto. – stinkycheeseman

Respuesta

9

jQuery.extend toma una cantidad infinita de argumentos, por lo que no es posible volver a escribir para que se ajuste al formato solicitado, sin interrumpir la funcionalidad.

Puede, sin embargo, quitar fácilmente la propiedad después de extender, mediante el delete operador:

var object = { 
    "foo": "bar" 
    , "bim": "baz" 
}; 

// extend the object except for the bim property 
var clone = $.extend({}, object); 
delete clone.bim; 
// = { "foo":"bar" } 
+0

Ah, ¿entonces no hay manera de reprimir una cierta propiedad? Intento no gastar demasiado tiempo/recursos copiando cosas que no voy a usar. – stinkycheeseman

+2

@stinkycheeseman No sin crear una nueva implementación. Aquí está el código fuente anotado de 'jQuery.extend', en caso de que esté interesado: http://james.padolsey.com/jquery/#v=git&fn=jQuery.extend –

+0

Tengo el mismo requisito solo porque el hash contiene" parent ", y el padre vuelve a señalar a los hijos, y va en un bucle infinito, así que también quería evitar una clave como" padre "mientras realiza una copia profunda –

0

puede archivar lo que quiere, ya sea con pick o omit de underscore, ambos permiten hacer una copia de un objeto y filtrar ciertas claves del objeto fuente que se incluirá u omitirá en la copia/clon:

var object = { 
    "foo": "bar" 
    , "bim": Array [1000] 
}; 

// copy the object and omit the desired properties out 
// _.omit(sorceObject, *keys) where *keys = key names separated by coma or an array of keys 
var clone = _.omit(object, 'bim'); 
// { "foo":"bar" } 
Cuestiones relacionadas