ecmascript 6 - ¿Cómo puedo clonar un objeto de JavaScript excepto por una clave?
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 manera más fácil de hacer esto (preferiblemente utilizando ES6/7 si es posible)?
Respuesta #1
Hay una sintaxis de asignación por desestructuración en JavaScript que se puede usar
let obj = {a: 1, b: 2, c: 3, z:26};
let {b, ...rest} = obj;
// skips the "Unused variable" warning
let {b: _, ...rest} = obj;
// removes property based on the dynamic key
const dynamicKey = "b";
let {[dynamicKey]: _, ...rest} = obj;
Los navegadores modernos ya lo soportan de manera nativa. Ver: Operador de JavaScript: Asignación por desestructuración: Rest en objetos
Para las versiones antiguas del navegador, hay una opción para usar Babel y soportar la asignación por desestructuración. Se transpilará en:
"use strict";
function _objectWithoutProperties(obj, keys) {
var target = {};
for (var i in obj) {
if (keys.indexOf(i) >= 0) continue;
if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;
target[i] = obj[i];
}
return target;
}
var x = { a: 1, b: 2, c: 3, z: 26 };
var b = x.b;
var y = _objectWithoutProperties(x, ["b"]);
Respuesta #2
Uso este one-liner de ESNext
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = (({ b, c, ...o }) => o)(obj) // remove b and c
console.log(clone)Editar: Si te sientes abrumado por esta sintaxis, aquí hay algo más legible:
const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = {...obj}
delete clone.b
delete clone.c
console.log(clone)Respuesta #3
var clone = Object.assign({}, {a: 1, b: 2, c: 3});
delete clone.b;
o si acepta que la propiedad sea indefinida:
var clone = Object.assign({}, {a: 1, b: 2, c: 3}, {b: undefined});
Respuesta #4
Para aquellos que no pueden usar ES6, pueden usar lodash o underscore.
_.omit(x, 'b')
O ramda.
R.omit('b', x)
Respuesta #5
Para agregar a la respuesta de Ilya Palkin: incluso puedes eliminar claves dinámicamente:
const x = {a: 1, b: 2, c: 3, z:26};
const objectWithoutKey = (object, key) => {
const {[key]: deletedKey, ...otherKeys} = object;
return otherKeys;
}
console.log(objectWithoutKey(x, 'b')); // {a: 1, c: 3, z:26}
console.log(x); // {a: 1, b: 2, c: 3, z:26};
Demostración en Babel REPL
Fuente :
- https://twitter.com/ydkjs/status/699845396084846592
Respuesta #6
Puedes escribir una función auxiliar simple para eso. Lodash tiene una función similar con el mismo nombre: omit
function omit(obj, omitKey) {
return Object.keys(obj).reduce((result, key) => {
if(key !== omitKey) {
result[key] = obj[key];
}
return result;
}, {});
}
omit({a: 1, b: 2, c: 3}, 'c') // {a: 1, b: 2}
Además, tenga en cuenta que es más rápido que Object.assign y delete luego: http://jsperf.com/omit-key
Respuesta #7
Aquí hay una opción para omitir claves dinámicas que creo que aún no se ha mencionado:
const obj = { 1: 1, 2: 2, 3: 3, 4: 4 };
const removeMe = 1;
const { [removeMe]: removedKey, ...newObj } = obj;
removeMe se ha aliasado como removedKey y se ignora. newObj se convierte en { 2: 2, 3: 3, 4: 4 }. Tenga en cuenta que la clave eliminada no existe, el valor no se estableció simplemente en undefined.
Respuesta #8
Quizás algo así:
var copy = Object.assign({}, {a: 1, b: 2, c: 3})
delete copy.c;
¿Esto es suficientemente bueno? ¿O realmente no se puede copiar c?
Respuesta #9
Usando la desestructuración de objetos
const omit = (prop, { [prop]: _, ...rest }) => rest;
const obj = { a: 1, b: 2, c: 3 };
const objWithoutA = omit('a', obj);
console.log(objWithoutA); // {b: 2, c: 3}Respuesta #10
Estoy usando la desestructuración de objetos aquí. He separado la contraseña en variables y las variables restantes contienen todas las propiedades y valores del objeto excepto la contraseña. NOTA: rest no es una palabra clave fija aquí, puedes nombrarla según corresponda
const obj = {name:"john", password:"Abcds12@", id:"125455"}
const {password,...rest} = obj;
console.log(rest);