Tengo un objeto JS plano:
{a: 1, b: 2, c: 3, ..., z:26}
Quiero clonar el objeto excepto por un elemento:
{a: 1, c: 3, ..., z:26}
¿Cuál es la forma más fácil de hacer esto (prefiriendo usar es6 / 7 si es posible)?
Tengo un objeto JS plano:
{a: 1, b: 2, c: 3, ..., z:26}
Quiero clonar el objeto excepto por un elemento:
{a: 1, c: 3, ..., z:26}
¿Cuál es la forma más fácil de hacer esto (prefiriendo usar es6 / 7 si es posible)?
Respuestas:
Si usa Babel , puede usar la siguiente sintaxis para copiar la propiedad b de x en la variable b y luego copiar el resto de las propiedades en la variable y :
y se trasladará a:
fuente
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
que se agregó en v3.15.0 (3 de febrero de 2017). Ver: commit c59a0bab
alcance.o si acepta que la propiedad no esté definida:
fuente
Para agregar a la respuesta de Ilya Palkin: incluso puede eliminar claves dinámicamente:
Demo en Babel REPL
Fuente:
fuente
_
cuál está permitido para una variable que no tiene intención de usar?var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
Para aquellos que no pueden usar ES6, pueden usar
lodash
ounderscore
.O
ramda
.fuente
_.omit(x, 'b')
delete
.Yo uso este ESNext one liner
Si necesita una función de propósito general:
fuente
map
puede hacer:(({b, c, ...others}) => ({...others}))(obj)
Puede escribir una función auxiliar simple para ello. Lodash tiene una función similar con el mismo nombre: omitir
Además, tenga en cuenta que es más rápido que Object.assign y elimine luego: http://jsperf.com/omit-key
fuente
Tal vez algo como esto:
¿Es esto lo suficientemente bueno? ¿O no puede
c
ser copiado?fuente
Usando la Desestructuración de Objetos
fuente
_
no resuelve el problema de ESLint ...Oye, parece que te encuentras con problemas de referencia cuando intentas copiar un objeto y luego eliminar una propiedad. En algún lugar debe asignar variables primitivas para que JavaScript cree un nuevo valor.
Truco simple (puede ser horrible) que usé fue esto
fuente
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
. Ni siquiera tiene que eliminarlo, solo necesita un valor falso.Aquí hay una opción para omitir claves dinámicas que creo que aún no se ha mencionado:
removeMe
es aliasremovedKey
e ignorado.newObj
se convierte{ 2: 2, 3: 3, 4: 4 }
. Tenga en cuenta que la clave eliminada no existe, el valor no solo se estableció enundefined
.fuente
fuente
Lodash omitir
fuente
También puede usar el operador de propagación para hacer esto
fuente
copy
const copy = { ...source, b: undefined }
reduce a exactamente lo mismo.Las soluciones anteriores que usan estructuración adolecen del hecho de que tiene una variable usada, lo que podría causar quejas de ESLint si está usando eso.
Así que aquí están mis soluciones:
En la mayoría de las plataformas (excepto IE a menos que use Babel), también podría hacer:
fuente
Qué tal esto:
fuente
Si se trata de una variable enorme, no desea copiarla y luego eliminarla, ya que esto sería ineficiente.
Un bucle for simple con una comprobación hasOwnProperty debería funcionar, y es mucho más adaptable a las necesidades futuras:
fuente
¿Qué hay de esto? Nunca encontré este patrón, pero solo estaba tratando de excluir una o más propiedades sin la necesidad de crear un objeto adicional. Esto parece hacer el trabajo, pero hay algunos efectos secundarios que no puedo ver. Por supuesto, no es muy legible.
fuente
Lo logré de esta manera, como un ejemplo de mi reductor Redux:
En otras palabras:
fuente
const { [removeMe]: removedKey, ...newObj } = obj;
- vea mi respuesta a esta pregunta.Recientemente lo hice de esta manera muy simple:
simplemente usando el operador spread para separar la propiedad no deseada:
... y object.assign para tomar solo la parte 'rest':
fuente
rest
ya es un objeto nuevo, no necesita la última línea. Además, esto es idéntico a la solución aceptada.fuente