简体   繁体   中英

How to rename key most efficiently in array of items in javascript?

I have an array of 10000 objects. Each object is like this:

{"id":5, "name": "Jordin Sparks}

What is the most efficient and fastest way for me to rename keys such that every object in the array becomes:

{"num":5, "fullname": "Jordin Sparks"}

In other words, "id" property is renamed to "num" and the "name" property for each object is renamed to "fullname".

I have no idea if this is indeed the most efficient, but here is my attempt.

for(var i = arr.length; i--; ){
  var obj = arr[i];
  obj.num = obj.id;
  obj.fullname = obj.name;
  delete obj.id;
  delete obj.name;
}

Personally, I would do it like this.

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];
       }
    }
  }
}

You would call it like so, where myArray is your array of objects.

renameKeys(myArray, [ 
  {from: "id", to: "num" }, 
  { from: "name", to: "fullname" } 
]);

Has the advantage that it is reusable for any number of name re-mappings. Doesn't modify native prototypes. And only iterates once around the array, no matter how many re-mappings take place.

Brute force approach. Convert to string, rename fields and parse to 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);

Edit: modify replace to global.

From https://stackoverflow.com/a/4648411/5403473 :

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;
};

You would run objectOf1000.renameProperty('id', 'num') and objectOf1000.renameProperty('name', 'full name')

arr.map(function (item) { return { num: item.id, fullname: item.name } });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM