有没有一种聪明(即优化)的方式来重命名JavaScript对象中的键?
非优化的方法如下:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
有没有一种聪明(即优化)的方式来重命名JavaScript对象中的键?
非优化的方法如下:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
这里有一个示例,可以创建一个带有重命名键的新对象。
let x = { id: "checkout", name: "git checkout", description: "checkout repository" };
let renamed = Object.entries(x).reduce((u, [n, v]) => {
u[`__${n}`] = v;
return u;
}, {});
function renameKeys(arrayObject, newKeys, index = false) {
let newArray = [];
arrayObject.forEach((obj,item)=>{
const keyValues = Object.keys(obj).map((key,i) => {
return {[newKeys[i] || key]:obj[key]}
});
let id = (index) ? {'ID':item} : {};
newArray.push(Object.assign(id, ...keyValues));
});
return newArray;
}
测试
const obj = [{ a: "1", b: "2" }, { a: "5", b: "4" } ,{ a: "3", b: "0" }];
const newKeys = ["A","C"];
const renamedObj = renameKeys(obj, newKeys);
console.log(renamedObj);
我希望你能帮我做到这一点
const originalObj = {
a: 1,
b: 2,
c: 3, // need replace this 'c' key into 'd'
};
const { c, ...rest } = originalObj;
const newObj = { ...rest, d: c };
console.log({ originalObj, newObj });
我采用了自己的方式,改编了 Mulhoon的好文章typescript post,以便更改多个键:
const renameKeys = <
TOldKey extends keyof T,
TNewkey extends string,
T extends Record<string, unknown>
>(
keys: {[ key: string]: TNewkey extends TOldKey ? never : TNewkey },
obj: T
) => Object
.keys(obj)
.reduce((acc, key) => ({
...acc,
...{ [keys[key] || key]: obj[key] }
}), {});
renameKeys({id: 'value', name: 'label'}, {id: 'toto_id', name: 'toto', age: 35});
var arr = { id: 'toto_id', name: 'toto', age: 35 };var arr2 = renameKeys({ id: 'value', name: 'label' }, arr);console.log(arr2)
。如何将其详细说明以使用“对象数组”而不是单个对象? - Timo如果有人需要重命名对象的键:
const renameKeyObject = (obj, oldKey, newKey) => {
if (oldKey === newKey) return obj;
Object.keys(obj).forEach((key) => {
if (key === oldKey) {
obj[newKey] = obj[key];
delete obj[key];
} else if (obj[key] !== null && typeof obj[key] === "object") {
obj[key] = renameKeyObject(obj[key], oldKey, newKey);
}
});
return obj;
};
npm i paix
import { paix } from 'paix';
const source_object = { FirstName: "Jhon", LastName: "Doe", Ignored: true };
const replacement = { FirstName: 'first_name', LastName: 'last_name' };
const modified_object = paix(source_object, replacement);
console.log(modified_object);
// { Ignored: true, first_name: 'Jhon', last_name: 'Doe' };
我认为你的方式是优化的。但你最终会得到重新排序的键。新创建的键将附加在末尾。我知道你永远不应该依赖于键的顺序,但如果你需要保留它,你需要逐个遍历所有键,并在该过程中构建一个新对象,逐一替换相关键。
就像这样:
var new_o={};
for (var i in o)
{
if (i==old_key) new_o[new_key]=o[old_key];
else new_o[i]=o[i];
}
o=new_o;
delete (o[new_key] = o[old_key], o)[old_key]
这样做会有任何问题吗?
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 renameKey = (oldKey, newKey) => {
_.reduce(obj, (newObj, value, key) => {
newObj[oldKey === key ? newKey : key] = value
return newObj
}, {})
}
它不是替换原始键,而是构建一个新对象,这很清楚。 问题中的方法虽然可行,但会改变对象的顺序,因为它将新的键值添加到最后。