最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

remove the space in keys in a nested object using javascript - Stack Overflow

programmeradmin2浏览0评论

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??

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??

Share Improve this question edited Apr 21, 2017 at 8:14 Aluan Haddad 31.9k10 gold badges83 silver badges95 bronze badges asked Apr 21, 2017 at 8:04 Sunil LamaSunil Lama 4,5391 gold badge20 silver badges48 bronze badges 3
  • 1 Wow, that is some jacked up code. Nesting like that is very bad for readability. Avoid using delete – Aluan Haddad Commented Apr 21, 2017 at 8:06
  • @dan, it doesn't even remove the whitespace of the very first key. – Sunil Lama Commented Apr 21, 2017 at 8:09
  • @AluanHaddad, Hmmm i really can't get it to work somehow. I know the solution must be really simple. But i am stucked :/ – Sunil Lama Commented Apr 21, 2017 at 8:10
Add a ment  | 

4 Answers 4

Reset to default 5

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

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
}

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

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;
发布评论

评论列表(0)

  1. 暂无评论