Reputation: 4539
I want to replace the whitespace of keys in a nested object. I have an object as follows:
var data =
{ 'General Information':
{ 'Referral No': '123123',
Marketer: '',
Casemanager: 'Alexis Clark',
'CM Username': '',
VOC: '',
'Foreign Voluntary': '',
},
'Account Name': 'CTS Health',
}
What i did is:
for (var k in data) {
if (k.replace(/\s/g, '') !== k) {
data[k.replace(/\s/g, '')] = data[k];
if (data[k] !== null && typeof data[k] === 'object') {
for (var x in data[k]) {
if (x.replace(/\s/g, '') !== x) {
data[k][x.replace(/\s/g, '')] = data[k][x];
delete data[k][x];
}
}
}
delete data[k];
}
}
I get this:
{ GeneralInformation:
{ 'Referral No': '123123',
Marketer: '',
Casemanager: 'Alexis Clark',
'CM Username': '',
VOC: '',
'Foreign Voluntary': '',
},
AccountName: 'CTS Health',
}
What i want is:
{ GeneralInformation:
{ ReferralNo: '123123',
Marketer: '',
Casemanager: 'Alexis Clark',
CMUsername: '',
VOC: '',
ForeignVoluntary: '',
},
AccountName: 'CTS Health',
}
What am i doing wrong here??
Upvotes: 6
Views: 4721
Reputation: 8051
This works great for me
const replaceKeys = (object) => {
Object.keys(object).forEach(function (key) {
// const twoLower = key.toLowerCase();
const removeSpace = key.replace(/\s+/g, '');
const newKey = removeSpace.toString().toLowerCase();
if (object[key] && typeof object[key] === 'object') {
replaceKeys(object[key]);
}
if (key !== newKey) {
object[newKey] = object[key];
delete object[key];
}
});
return object;
Upvotes: 0
Reputation: 31823
We can create a new object instead of mutating the existing one. This both makes it easier to test and also reduces potential for bugs cropping up due to sharing.
function withNormalizedKeys(o) {
return Object.entries(o)
.map(([key, value]) => [key.replace(/\s+/g, ''), value])
.reduce((result, [normalizedKey, value]) => {
result[normalizedKey] =
value && typeof value === 'object'
? withNormalizedKeys(value)
: value;
return result;
}, {});
}
const data = {
'General Information': {
'Referral No': '123123',
Marketer: '',
Casemanager: 'Alexis Clark',
'CM Username': '',
VOC: '',
'Foreign Voluntary': ''
},
'Account Name': 'CTS Health'
};
const normalized = withNormalizedKeys(data);
console.log(normalized);
Upvotes: 0
Reputation: 1650
Try recursive approach.
var replaceSpace = function (obj) {
Object.keys(obj).forEach(function(key){
var newKey = key.split(' ').join('');
if(object[key] && typeof obj[key] === "object"){
obj[newKey] = replaceSpace(obj[key])
}else{
obj[newKey] = obj[key]
}
if(key != newKey)
delete obj[key]
})
return obj
}
Upvotes: 0
Reputation: 386600
You could use an iterative and recursive approach for nested objects.
function replaceKeys(object) {
Object.keys(object).forEach(function (key) {
var newKey = key.replace(/\s+/g, '');
if (object[key] && typeof object[key] === 'object') {
replaceKeys(object[key]);
}
if (key !== newKey) {
object[newKey] = object[key];
delete object[key];
}
});
}
var data = { 'General Information': { 'Referral No': '123123', Marketer: '', Casemanager: 'Alexis Clark', 'CM Username': '', VOC: '', 'Foreign Voluntary': '', }, 'Account Name': 'CTS Health' };
replaceKeys(data);
console.log(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Upvotes: 5