Home > OS >  Unstring an object property name javascript
Unstring an object property name javascript

Time:08-13

I have an object similar to this:

const obj = {
  id: 1,
  name: {
    "english-us": "John",
    "english-uk": "John",
    "italian-eu": "Giovanni",
  },
};

I want to transfrorm every property name that is a string into a non-string one, like this:

const obj = {
  id: 1,
  name: {
    english_us: "John",
    english_uk: "John",
    italian_eu: "Giovanni",
  },
};

I can't modify the original object. I get it from an axios request.

CodePudding user response:

You could use regex with stringify

let output = JSON.parse(JSON.stringify(obj).replace(/"(.*?)":.*?,?/g,
                                       key=>key.replace(/\-/g, `_`)));

Output

console.log(JSON.stringify(output, null, 4));
/*
{
    "id": 1,
    "name": {
        "english_us": "John",
        "english_uk": "John",
        "italian_eu": "Giovanni"
    }
}*/

CodePudding user response:

If you can copy the object, you could check this solution for declaring the attributes: link

CodePudding user response:

There are a few ways of achieving this. This example has a function that converts the key on every iteration of the name entries. A new names object is updated with these properties, and is later folded into a new object along with the existing properties of the original object.

const obj = {
  id: 1,
  name: {
    "english-us": "John",
    "english-uk": "John",
    "italian-eu": "Giovanni",
  },
};

const convert = (key) => key.replace('-', '_');

const updatedName = {};

for (const [key, value] of Object.entries(obj.name)) {
  updatedName[convert(key)] = value;
}

const newObj = { ...obj, name: updatedName };

console.log(newObj);

CodePudding user response:

You can convert object to JSON and convert back.

const obj = {
  id: 1,
  name: {
    "english-us": "John",
    "english-uk": "John",
    "italian-eu": "Giovanni",
  },
};
console.log(JSON.parse(JSON.stringify(obj)))

CodePudding user response:

Two ways to clone the object and rename all keys from its name property

const obj = {
  id: 1,
  name: {
    "english-us": "John",
    "english-uk": "John",
    "italian-eu": "Giovanni",
  },
};
// clone obj
const myObj = window.structuredClone ?
  structuredClone(obj) : JSON.parse(JSON.stringify(obj));

// rename all keys in myObj.name
Object.keys(myObj.name).forEach(key => {
  myObj.name[key.replace(/\-/g, `_`)] = myObj.name[key];
  delete myObj.name[key];
});

console.log(myObj.name.english_us);
// obj is untouched
console.log(obj.name[`english-us`]);
// myObj.name[`english-us`] does not exist
console.log(myObj.name[`english-us`]);

// alternative: clone and rename in one go
const myObjClone = {
  ...obj,
  name: Object.fromEntries(
          Object.entries(obj.name)
            .reduce( (acc, [k, v]) => 
              [ ...acc, [ k.replace(/\-/g, `_`), v ] ] , [] ) )
};
console.log(myObjClone.name.italian_eu);
// obj is untouched
console.log(obj.name[`italian-eu`]);
// myObjClone.name[`italian-eu`] does not exist
console.log(myObjClone.name[`italian-eu`]);

  • Related