JavaScript:对象重命名键

484

有没有一种聪明(即优化)的方式来重命名JavaScript对象中的键?

非优化的方法如下:

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

21
“optimized”是什么意思?我认为这已经非常简洁了,没有内置的“重命名”操作。 - Pointy
12
这就是你能得到的全部。我会担心我的申请中的其他事情。另外,你正在处理对象而不是数组。在JavaScript中(严格意义上),没有关联数组。 - Felix Kling
5
@Jean Vincent: 它速度真的很慢吗? - Felix Kling
12
这是最优化和基础版。 - Livingston Samuel
6
除Safari以外,你的版本在所有现代浏览器中都是最快的。样例测试案例请访问 http://jsperf.com/livi-006。 - Livingston Samuel
显示剩余12条评论
36个回答

0
const clone = (obj) => Object.assign({}, obj);

const renameKey = (object, key, newKey) => {

    const clonedObj = clone(object);
  
    const targetKey = clonedObj[key];
  
  
  
    delete clonedObj[key];
  
    clonedObj[newKey] = targetKey;
  
    return clonedObj;
     };

  let contact = {radiant: 11, dire: 22};





contact = renameKey(contact, 'radiant', 'aplha');

contact = renameKey(contact, 'dire', 'omega');



console.log(contact); // { aplha: 11, omega: 22 };

0
尝试使用 Lodash transform。
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);

-1
通常,如果您想要根据 keyMap 重命名键并获取一个新对象(而不改变原始对象),则可以使用以下基于 lodash mapKeys 的实现:
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}

-1
如果您想保持对象的相同顺序
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');

const changedKey 应该改为 const valueOfChangedKey。如果键位于对象中间,则不起作用。您需要使用 cloneDeep 函数。因此,这不是一个很好的解决方案 :) - ya_dimon

-1
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

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

“仅有代码的答案并不是高质量的答案”。虽然这段代码可能很有用,但您可以通过解释它为什么有效、如何有效、何时应该使用以及其限制是什么来改进它。请编辑您的答案,包括解释和相关文档链接。 - Stephen Ostermiller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接