2017-04-21 48 views
6

我想要替換嵌套對象中鍵的空白。我有一個對象如下:使用javascript刪除嵌套對象中鍵的空間

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

我所做的是:

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

我得到這個:

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

我要的是:

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

什麼我在這裏做錯了嗎?

+1

哇,這是一些頂起來的代碼。像這樣嵌套對可讀性來說非常糟糕。避免使用'delete' –

+0

@dan,它甚至不會刪除第一個鍵的空格。 –

+0

@AluanHaddad,嗯,我真的無法以某種方式讓它工作。我知道解決方案一定非常簡單。但我被困住了:/ –

回答

5

您可以對嵌套對象使用迭代和遞歸方法。

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

不錯,打我吧 –

+1

尼娜,明白了。感謝您的回答。 –

-2

我們可以創建一個新的對象,而不是突變的現有的。這樣既可以更容易地進行測試,而且還可以減少由於共享而出現錯誤的可能性。

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

非常感謝你的回答。 –

+0

Downvote一個工作答案。我想要一個理由。 –

+0

你有我的反投票,因爲它在那裏使用const而不是var key。 –

0

嘗試遞歸方法。

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

如果'obj [key] === null' –

+0

a = {}; a [null] = 12; typeof a [null]; 「數字」何時失敗? –

+0

'typeof null ===「object」'注意其他答案處理這個 –