Búsqueda de sitios web

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

Artículos relacionados