JavaScript: объект переименовать ключ

Есть ли умный (то есть оптимизированный) способ переименовать ключ в объекте JavaScript?

Неоптимизированный способ будет:

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

37 ответов

Пробуем использовать преобразование lodash.

var _ = require('lodash');

obj = {
  "name": "abc",
  "add": "xyz"
};

var newObject = _.transform(obj, function(result, val, key) {

  if (key === "add") {
    result["address"] = val
  } else {
    result[key] = val
  }
});
console.log(obj);
console.log(newObject);

После поиска многих ответов это лучшее решение для меня:

      const renameKey = (oldKey, newKey) => {
  _.reduce(obj, (newObj, value, key) => {
    newObj[oldKey === key ? newKey : key] = value
    return newObj
  }, {})
}

Вместо замены исходного ключа он конструирует новый объект, это понятно. Способ в вопросе работал, но изменит порядок объекта, потому что он добавляет новый ключ-значение к последнему.

Как правило, если вы хотите получить новый объект (без изменения исходного) с ключами, переименованными в соответствии сkeyMap- вы можете использовать следующую реализацию на основе lodashmapKeys:

      const {mapKeys} = require('lodash');
const renameKeys = (obj, keyMap) => _.mapKeys(obj, (value, key) => keyMap[key] || key);

Пример использования:

      renameKeys({a: 1, b: 2, c: 3}, {c: 'p', a: 'm'})
> {m: 1, b: 2, p: 3}
      function iterate(instance) {
  for (let child of instance.tree_down) iterate(child);

  instance.children = instance.tree_down;
  delete instance.tree_down;
}

iterate(link_hierarchy);

console.log(link_hierarchy);

Будет ли проблема просто сделать это?

      someObject = {...someObject, [newKey]: someObject.oldKey}
delete someObject.oldKey

Что можно было бы обернуть в функцию, если хотите:

      const renameObjectKey = (object, oldKey, newKey) => {
    // if keys are the same, do nothing
    if (oldKey === newKey) return;
    // if old key doesn't exist, do nothing (alternatively, throw an error)
    if (!object.oldKey) return;
    // if new key already exists on object, do nothing (again - alternatively, throw an error)
    if (object.newKey !== undefined) return;

    object = { ...object, [newKey]: object[oldKey] };
    delete object[oldKey];

    return { ...object };
};

      // in use
let myObject = {
    keyOne: 'abc',
    keyTwo: 123
};

// avoids mutating original
let renamed = renameObjectKey(myObject, 'keyTwo', 'renamedKey');

console.log(myObject, renamed);
// myObject
/* {
    "keyOne": "abc",
    "keyTwo": 123,
} */

// renamed
/* {
    "keyOne": "abc",
    "renamedKey": 123,
} */
const data = res
const lista = []
let newElement: any

if (data && data.length > 0) {

  data.forEach(element => {
      newElement = element

      Object.entries(newElement).map(([key, value]) =>
        Object.assign(newElement, {
          [key.toLowerCase()]: value
        }, delete newElement[key], delete newElement['_id'])
      )
    lista.push(newElement)
  })
}
return lista

Если вы хотите сохранить тот же порядок объекта

      changeObjectKeyName(objectToChange, oldKeyName: string, newKeyName: string){
  const otherKeys = cloneDeep(objectToChange);
  delete otherKeys[oldKeyName];

  const changedKey = objectToChange[oldKeyName];
  return  {...{[newKeyName] : changedKey} , ...otherKeys};

}

Как использовать:

      changeObjectKeyName ( {'a' : 1}, 'a', 'A');
Другие вопросы по тегам