JavaScript: clave de cambio de nombre de objeto

6 minutos de lectura

JavaScript clave de cambio de nombre de objeto
Juan Vicente

¿Existe una forma inteligente (es decir, optimizada) de cambiar el nombre de una clave en un objeto javascript?

Una forma no optimizada sería:

o[ new_key ] = o[ old_key ];
delete o[ old_key ];

  • ¿A qué te refieres con “optimizado”? No creo que pueda ser más conciso que eso; no hay una operación integrada de “cambio de nombre”.

    – Puntiagudo

    10 de enero de 2011 a las 14:30

  • Eso es todo lo que puedes conseguir. Me preocuparía por otras cosas en mi aplicación. Y por cierto, estás tratando con objetos, no con arreglos. No hay matrices asociativas en JavaScript (en un sentido estricto).

    – Félix Kling

    10 de enero de 2011 a las 14:32


  • @Jean Vincent: ¿Es tan lento?

    – Félix Kling

    10 de enero de 2011 a las 14:32

  • esta es la versión más optimizada y básica

    – Livingston Samuel

    10 de enero de 2011 a las 14:34

  • su versión es la más rápida en todos los navegadores modernos excepto Safari, caso de prueba de muestra @ jsperf.com/livi-006

    – Livingston Samuel

    10 de enero de 2011 a las 14:42


JavaScript clave de cambio de nombre de objeto
nverba

Si está mutando su objeto fuente, ES6 puede hacerlo en una sola línea.

delete Object.assign(o, {[newKey]: o[oldKey] })[oldKey];

O dos líneas si desea crear un nuevo objeto.

const newObject = {};
delete Object.assign(newObject, o, {[newKey]: o[oldKey] })[oldKey];

  • Intente: eliminar Object.assign(o, {newKey: o.oldKey }).oldKey; funcionó bien para mí

    – Tim

    8 de noviembre de 2018 a las 9:16

  • ¿Por qué hay la llave cuadrada? [] alrededor newKey? La solución funciona sin eso en realidad.

    – Soumya Kanti

    27 de enero de 2019 a las 4:59

  • Bien, tengo mi respuesta. Es la función ES6. Para cualquier otra persona que haya tropezado con esto como yo, aquí hay una buena respuesta.

    – Soumya Kanti

    27 de enero de 2019 a las 15:34

  • Esta respuesta sería más sólida si los nombres de las variables fueran más detallados.

    – rastreador bajo

    26 de mayo de 2019 a las 5:50

  • NOTA: El uso de Object.assign solo hace una copia superficial.

    – Juan

    25 de junio de 2020 a las 14:00

  • @ChaosPandion lo siento, pero estoy realmente cansado del código JS lleno de errores, actualmente estoy escribiendo una Guía (github.com/BonsaiDen/JavaScript-Jardín) sobre todas las peculiaridades (incluida la que ahora ha solucionado), esto podría haberme puesto en algún tipo de modo de despotricar;) (Eliminó el -1 ahora)

    – Ivo Wetzel

    10 de enero de 2011 a las 15:58

  • @Ivo: ¿Podría explicar por qué cree que extender el prototipo es malo? ¡Se hicieron prototipos para extender al bebé!

    – ChaosPandión

    10 de enero de 2011 a las 15:58

  • @Ivo: estoy de acuerdo en que es arriesgado, pero no hay nada que me impida extender el prototipo si siento que conduce a un código más expresivo. Aunque vengo de una mentalidad de ECMAScript 5 donde puede marcar una propiedad como no enumerable a través de Object.defineProperty.

    – ChaosPandión

    10 de enero de 2011 a las 16:02

  • @Ivo: si es una práctica adecuada usar siempre hasOwnProperty para comprobar las propiedades y dentro for ... in bucles, entonces, ¿por qué importa si extendemos Object?

    –David Tang

    11 de enero de 2011 a las 0:08


  • Este código funciona, pero la advertencia es que si el nuevo nombre de clave ya existe, su valor será pisoteado: jsfiddle.net/ryurage/B7x8x

    – Brandon Minton

    22 de julio de 2014 a las 16:06

En caso de que alguien necesite cambiar el nombre de una lista de propiedades:

function renameKeys(obj, newKeys) {
  const keyValues = Object.keys(obj).map(key => {
    const newKey = newKeys[key] || key;
    return { [newKey]: obj[key] };
  });
  return Object.assign({}, ...keyValues);
}

Uso:

const obj = { a: "1", b: "2" };
const newKeys = { a: "A", c: "C" };
const renamedObj = renameKeys(obj, newKeys);
console.log(renamedObj);
// {A:"1", b:"2"}

  • esta debería ser una respuesta aceptada, funcionó muy bien para mi caso de uso. Tuve que convertir una respuesta de la API que anteponía nombres de países con cadenas innecesarias. Convirtió el objeto en una matriz de claves y lo asignó a través de cada clave con el método de subcadena y devolvió un nuevo objeto con una nueva clave y un valor indexado por la clave original

    – Akin Hwan

    10 de febrero de 2018 a las 18:46

  • Esto es bueno ya que no elimina la clave anterior. Eliminar la clave anterior eliminará la clave por completo del objeto si el nombre de la clave no ha cambiado. En mi ejemplo, estaba convirtiendo my_object_property para myObjectProperty, sin embargo, si mi propiedad tenía una sola palabra, se eliminaba la clave. +1

    – blueprintchris

    5 de diciembre de 2019 a las 14:49


Me gustaría simplemente usar el ES6(ES2015) ¡manera!

¡Necesitamos mantenernos al día!

const old_obj = {
    k1: `111`,
    k2: `222`,
    k3: `333`
};
console.log(`old_obj =\n`, old_obj);
// {k1: "111", k2: "222", k3: "333"}


/**
 * @author xgqfrms
 * @description ES6 ...spread & Destructuring Assignment
 */

const {
    k1: kA, 
    k2: kB, 
    k3: kC,
} = {...old_obj}

console.log(`kA = ${kA},`, `kB = ${kB},`, `kC = ${kC}\n`);
// kA = 111, kB = 222, kC = 333

const new_obj = Object.assign(
    {},
    {
        kA,
        kB,
        kC
    }
);

console.log(`new_obj =\n`, new_obj);
// {kA: "111", kB: "222", kC: "333"}

atajo de pantalla de demostración

  • esta debería ser una respuesta aceptada, funcionó muy bien para mi caso de uso. Tuve que convertir una respuesta de la API que anteponía nombres de países con cadenas innecesarias. Convirtió el objeto en una matriz de claves y lo asignó a través de cada clave con el método de subcadena y devolvió un nuevo objeto con una nueva clave y un valor indexado por la clave original

    – Akin Hwan

    10 de febrero de 2018 a las 18:46

  • Esto es bueno ya que no elimina la clave anterior. Eliminar la clave anterior eliminará la clave por completo del objeto si el nombre de la clave no ha cambiado. En mi ejemplo, estaba convirtiendo my_object_property para myObjectProperty, sin embargo, si mi propiedad tenía una sola palabra, se eliminaba la clave. +1

    – blueprintchris

    5 de diciembre de 2019 a las 14:49


1646966229 998 JavaScript clave de cambio de nombre de objeto
devin rhode

Si no desea mutar sus datos, considere esta función…

renameProp = (oldProp, newProp, { [oldProp]: old, ...others }) => ({
  [newProp]: old,
  ...others
})

Una explicación detallada de Yazeed Bzadough
https://medium.com/front-end-hacking/immutably-rename-object-keys-in-javascript-5f6353c7b6dd


Aquí hay una versión amigable mecanografiada:

// These generics are inferred, do not pass them in.
export const renameKey = <
  OldKey extends keyof T,
  NewKey extends string,
  T extends Record<string, unknown>
>(
  oldKey: OldKey,
  newKey: NewKey extends keyof T ? never : NewKey,
  userObject: T
): Record<NewKey, T[OldKey]> & Omit<T, OldKey> => {
  const { [oldKey]: value, ...common } = userObject

  return {
    ...common,
    ...({ [newKey]: value } as Record<NewKey, T[OldKey]>)
  }
}

Le impedirá golpear una clave existente o cambiarle el nombre a la misma cosa

  • Esta es la mejor solución. Pero necesito algo de comprensión sobre el operador de propagación.

    – franco phong

    28 de abril de 2020 a las 11:46

  • Absolutamente brillante. Utilizando el primer parámetro, oldProppor alguna destrucción mágica en el 3er param.

    – Devin Rhode

    24 de noviembre de 2020 a las 3:46

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad