95

How can I change the key name in an array of objects?

var arrayObj = [{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'}];

How can I change each key1 to stroke so that I get:

var arrayObj = [{stroke:'value1', key2:'value2'},{stroke:'value1', key2:'value2'}];
1

11 Answers 11

97

In recent JavaScript (and TypeScript), use destructuring with rest syntax, spread syntax, and array map to replace one of the key strings in an array of objects.

const arrayOfObj = [{
  key1: 'value1',
  key2: 'value2'
}, {
  key1: 'value1',
  key2: 'value2'
}];
const newArrayOfObj = arrayOfObj.map(({
  key1: stroke,
  ...rest
}) => ({
  stroke,
  ...rest
}));

console.log(newArrayOfObj);

Sign up to request clarification or add additional context in comments.

5 Comments

Spread is optional, It's just there if you want to keep your old values in your array. Nice answer, really neat and powerful nonetheless.
How to make "stroke" dynamically passed to map function?
@Prashant, good question (how to pass 'stroke' dynamically)! Would the following code work for you? const newKey = 'stroke'; const newArrayOfObj = arrayOfObj.map(({ key1, ...rest }) => ({ [newKey]: key1, ...rest }));
Note, this doesn't replace anything. It makes a new array with new property names.
Is it possible to use this on nested attributes, e.g. const arrayOfObj = [{attributes: { key1: 'value1', key2: 'value2' }}, {attributes: { key1: 'value1', key2: 'value2' }}];?
50
var i;
for(i = 0; i < arrayObj.length; i++){
    arrayObj[i].stroke = arrayObj[i]['key1'];
    delete arrayObj[i].key1;
}

3 Comments

You can see it here: jsfiddle.net/Paulpro/XVxvy/2 It alerts "undefined" and then "value1"
Thanks for the solution but what If the object is with dynamic key? like: var arrayObj = [{abcKey,'value1', acdKey:'value2',defKey:'value3', cfgKey:'value4'}];
it remove the key, what should i do :(
37

ES6 map() method:

let arrayObj = [{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'}];

arrayObj = arrayObj.map(item => {
  return {
    stroke: item.key1,
    key2: item.key2
  };
});
    
console.log("arrayObj = " + JSON.stringify(arrayObj));

4 Comments

But you need to know all the keys in the object and also write each of them in the returning object.
you dont need to know all the keys, you can just use the spread operator like this: var arrayObj = [{key1:'value1', key2:'value2'},{key1:'value1', key2:'value2'}]; arrayObj = arrayObj.map(item => { return { ...item, key2: item.key2 }; });
but this also keeps the old keys
Don't think so, try running the code snippet.
21

You can't change a property name, you have to add the value with a new name and delete the old property:

for (var i = 0; i < arrayObj.length; i++) {
  arrayObj[i].stroke = arrayObj[i].key1;
  delete arrayObj[i].key1;
}

3 Comments

Is delete supported by all browser versions?
Yes, it's part of the Javascript language.
Ok, for some reason I thought it was not supported by some versions of IE or something.
17

just one line of code needed with ES6

try following code :

arrayObj.map(({ stroke, key2 }) => ({ yourNewKey: stroke, yourNewKey2: key2 }));

Comments

6

const company =  [{ id:"1", name:"somename"},{ id:"1", name:"somename"}]

company.map(({ id, name }) => ({ companyId: id, companyName: name }));

// output
//[{ companyId:"1", companyName:"somename"},{ companyId:"1", //companyName:"somename"}]

Comments

3

You don't change a key name. You can assign a new key name/value and then remove the previous key if you want. In your example:

var arrayObj = [{key1,'value1', key2:'value2'},{key1,'value1', key2:'value2'}];
var o = arrayObj[0];   // get first object
var val = o.key1;      // get current value
o.stroke = val;        // assign to new key
delete o.key1;         // remove previous key

If you wanted to do that for all the objects in your main array, you would just put that in a loop that iterates over the contents of your array. I've put more intermediate assignments in here than neccessary just to document what's going on.

Or a shortened version in a loop:

for (var i = 0; i < arrayObj.length; i++) {
    var o = arrayObj[i];
    o.stroke = o.key1;
    delete o.key1;
}

3 Comments

Thanks for this. As much as I like ES5/6 I had to do this in google tag manager and use vanilla js.
@lharby - this is vanilla js already. This would work in es3.
that's what I meant some of the newer es5/6 features are NOT supported in gtm. So thank you.
2
function changeKey(originalKey, newKey, arr)
{
  var newArr = [];
  for(var i = 0; i < arr.length; i++)
  {
    var obj = arr[i];
    obj[newKey] = obj[originalKey];
    delete(obj[originalKey]);
    newArr.push(obj);
  }
  return newArr;
}

Comments

1

pure javascript

var array=[{oldkey:'oldkeyvalue',oldkey2:'oldkey2'}]
var result=array.map(({ oldkey: newkey, ...rest }) => ({ newkey, ...rest }));
console.log(result)

lodash or underscore js

//Lodash/underscore.js
_.map(array,(({ oldkey: newkey, ...rest }))=>({ oldkey: newkey, ...rest }))

The above technique cant set string name

eg:full name or last name

wrong way:

name:full name

right way

name:full_name

you can achieve string object in same way using map

array.map((x)=>{
var y={};
//also use spread operator if necessary but key want to remove manually

y['full name']=x['name'];
return y;
})

Comments

0

Another option, when you have other arrays, and they have objects with different keys names and your objects they have equal size.

function convertKeys (arr) {
  const newFormat = arr.map((value) => {
    const arrFormat = Object.values(value)
    return {
      newKey1: arrFormat[0],
      newKey2: arrFormat[1]
    }
  })
}

In array.map, i converted the object to an array and got the values ​​by their index.

1 Comment

Welcome to SO. Please explain your answer a little in textual form and tell us, how it works and what makes it different from the other answers given.
-1

You can use an immutable way of changing an object. You can also add new key-value pairs to the object

let arrayOfObj = [{id:"0",name:'myName'},{id:"2",name:'myNewName'}]
const newArr = arrayOfObj.map(item => ({ ...item, id : Number(item.id),someRandomKey:'RandomValue' }))
console.log(newArr)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.