有没有一种聪明(即优化)的方式来重命名JavaScript对象中的键?
非优化的方法如下:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
有没有一种聪明(即优化)的方式来重命名JavaScript对象中的键?
非优化的方法如下:
o[ new_key ] = o[ old_key ];
delete o[ old_key ];
oldJson=[{firstName:'s1',lastName:'v1'},
{firstName:'s2',lastName:'v2'},
{firstName:'s3',lastName:'v3'}]
newJson = oldJson.map(rec => {
return {
'Last Name': rec.lastName,
'First Name': rec.firstName,
}
})
output: [{Last Name:"v1",First Name:"s1"},
{Last Name:"v2",First Name:"s2"},
{Last Name:"v3",First Name:"s3"}]
最好使用新的数组。个人认为,在不使用额外的重型插件和工具的情况下,重新命名对象中的键最有效的方法是:
var str = JSON.stringify(object);
str = str.replace(/oldKey/g, 'newKey');
str = str.replace(/oldKey2/g, 'newKey2');
object = JSON.parse(str);
如果您的对象结构无效,您还可以将其包装在 try-catch
中。完美运作 :)
{ a: 1, aa: 2, aaa: 3 }
中的'a'
,或者尝试重命名具有非字符串、数字或布尔值的值的对象,或者尝试处理循环引用。 - rsp使用最强大的REDUCE方法的另一种方式。
data = {key1: "value1", key2: "value2", key3: "value3"};
keyMap = {key1: "firstkey", key2: "secondkey", key3: "thirdkey"};
mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});
console.log(mappedData);
// { "firstkey": "value1", "secondkey": "value2", "thirdkey": "value3"}
我会这样做:
function renameKeys(dict, keyMap) {
return _.reduce(dict, function(newDict, val, oldKey) {
var newKey = keyMap[oldKey] || oldKey
newDict[newKey] = val
return newDict
}, {})
}
在您最喜欢的编辑器中尝试一下 <3
const obj = {1: 'a', 2: 'b', 3: 'c'}
const OLD_KEY = 1
const NEW_KEY = 10
const { [OLD_KEY]: replaceByKey, ...rest } = obj
const new_obj = {
...rest,
[NEW_KEY]: replaceByKey
}
重命名对象键的另一种方法:
让我们考虑这个对象:
let obj = {"name": "John", "id": 1, "last_name": "Doe"}
将名称键重命名为first_name:
let { name: first_name, ...rest } = obj;
obj = { first_name, ...rest }
现在,这个对象是:
{"first_name": "John", "id": 1, "last_name": "Doe"}
var myObj = {
field1: theirObj.FIELD1,
field2: theirObj.FIELD2,
(etc)
}
当然,我在这里做出了各种可能不正确的假设。如果这对你不适用,或者速度太慢(是吗?我没有测试过,但我想随着字段数量的增加,差异会越来越小),请忽略这一切:)
如果您不想这么做,并且您只需要支持特定的浏览器,您也可以使用新的getter方法来返回“uppercase(field)”:请参阅http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/以获取更多信息。
编辑:
令人难以置信的是,在我的工作中,至少在我的FF3.5上,这也快了将近两倍。请参见:http://jsperf.com/spiny001
如果您想保留迭代顺序(插入顺序),这里提供了一个建议:
const renameObjectKey = (object, oldName, newName) => {
const updatedObject = {}
for(let key in object) {
if (key === oldName) {
newObject[newName] = object[key]
} else {
newObject[key] = object[key]
}
}
object = updatedObject
}
虽然这并没有为重命名键提供更好的解决方案,但它提供了一种快速而简便的ES6方法来重命名对象中的所有键,同时不改变它们所包含的数据。
let b = {a: ["1"], b:["2"]};
Object.keys(b).map(id => {
b[`root_${id}`] = [...b[id]];
delete b[id];
});
console.log(b);
此页面列出的一些解决方案具有一些副作用:
这里是一种解决方案,它保持了键的位置不变,并且在IE9+中兼容,但必须创建一个新对象,并且可能不是最快的解决方案:
function renameObjectKey(oldObj, oldName, newName) {
const newObj = {};
Object.keys(oldObj).forEach(key => {
const value = oldObj[key];
if (key === oldName) {
newObj[newName] = value;
} else {
newObj[key] = value;
}
});
return newObj;
}