我有一个包含10000个对象的数组。每个对象都像这样:
{"id":5, "name": "Jordin Sparks}
什么是将键重命名为使数组中的每个对象变得最有效和最快的方法?
{"num":5, "fullname": "Jordin Sparks"}
换句话说,“id”属性被重命名为“num”,每个对象的“name”属性被重命名为“fullname”。
我有一个包含10000个对象的数组。每个对象都像这样:
{"id":5, "name": "Jordin Sparks}
{"num":5, "fullname": "Jordin Sparks"}
暴力破解方法。将其转换为字符串,重命名字段并解析为JSON。
var src = {"id":5, "name": "Jordin Sparks"};
var str = JSON.stringify(src);
var rst = JSON.parse(str.replace(/"id"/g, '"num"').replace(/"name"/g, '"fullname"'));
console.debug(rst);
编辑:将replace修改为global。
我不知道这是否是最有效的方法,但这是我的尝试。
for(var i = arr.length; i--; ){
var obj = arr[i];
obj.num = obj.id;
obj.fullname = obj.name;
delete obj.id;
delete obj.name;
}
function renameKeys(arr, nameMap) {
// loop around our array of objects
for(var i = 0; i < arr.length; i++) {
var obj = arr[i];
// loop around our name mappings
for(var j = 0; j < nameMap.length; j++) {
var thisMap = nameMap[j];
if(obj.hasOwnProperty(thisMap.from)) {
// found matching name
obj[thisMap.to] = obj[thisMap.from];
delete obj[thisMap.from];
}
}
}
}
renameKeys(myArray, [
{from: "id", to: "num" },
{ from: "name", to: "fullname" }
]);
具有可重用于任意数量的名称重新映射的优点。不修改本地原型。并且只在数组周围迭代一次,无论进行多少个重新映射。
arr.map(function (item) { return { num: item.id, fullname: item.name } });
来自https://dev59.com/-W445IYBdhLWcg3w5OEH#4648411:
Object.prototype.renameProperty = function (oldName, newName) {
// Do nothing if the names are the same
if (oldName == newName) {
return this;
}
// Check for the old property name to avoid a ReferenceError in strict mode.
if (this.hasOwnProperty(oldName)) {
this[newName] = this[oldName];
delete this[oldName];
}
return this;
};
objectOf1000.renameProperty('id', 'num')
和 objectOf1000.renameProperty('name', 'full name')
。