2017-04-21 7 views
6

Chcę zamienić białe znaki kluczy w zagnieżdżonym obiekcie. Mam obiektu w następujący sposób:usunąć spację w kluczach w obiekcie zagnieżdżonym za pomocą javascript

 var data = 
{ 'General Information': 
      { 'Referral No': '123123', 
       Marketer: '', 
       Casemanager: 'Alexis Clark', 
       'CM Username': '', 
       VOC: '', 
       'Foreign Voluntary': '', 
      }, 
    'Account Name': 'CTS Health', 
    } 

co zrobiłem to:

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

uzyskać to:

{ GeneralInformation: 
     { 'Referral No': '123123', 
      Marketer: '', 
      Casemanager: 'Alexis Clark', 
      'CM Username': '', 
      VOC: '', 
      'Foreign Voluntary': '', 
     }, 
    AccountName: 'CTS Health', 
    } 

co chcę:

{ GeneralInformation: 
     { ReferralNo: '123123', 
      Marketer: '', 
      Casemanager: 'Alexis Clark', 
      CMUsername: '', 
      VOC: '', 
      ForeignVoluntary: '', 
     }, 
    AccountName: 'CTS Health', 
    } 

Co Czy robię źle tutaj?

+1

Wow, to jest jakaś podnieta kod. Takie zagnieżdżanie jest bardzo szkodliwe dla czytelności. Unikaj używania 'delete' –

+0

@dan, nawet nie usuwa białych znaków pierwszego klucza. –

+0

@AluanHaddad, Hmmm naprawdę nie mogę tego jakoś uruchomić. Wiem, że rozwiązanie musi być naprawdę proste. Ale utknąłem:/ –

Odpowiedz

5

Do obiektów zagnieżdżonych można użyć podejścia iteracyjnego i rekursywnego.

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

+0

Miło, pobili mnie to –

+1

Nina, rozumiem. Dzięki za odpowiedź. –

-2

Możemy utworzyć nowy obiekt zamiast mutacji istniejącego. To sprawia, że ​​testowanie jest łatwiejsze, a także zmniejsza ryzyko pojawienia się błędów spowodowanych udostępnianiem.

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

+1

dzięki aluan za odpowiedź. –

+0

Podzielić działającą odpowiedź. Chciałbym mieć powód. –

+0

Masz moje głosowanie w dół na używanie const zamiast klawisza var tylko dlatego, że tam jest. –

0

Spróbuj rekurencyjnej podejście.

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 
} 
+0

To się nie powiedzie, jeśli "obj [klucz] === null' –

+0

a = {}; a [null] = 12; typeof a [null]; podaje "numer", kiedy to się nie powiedzie? –

+0

'typeof null ===" object "' zanotuj inne odpowiedzi obsłużyć to –

Powiązane problemy