2017-04-21 106 views
0

我有一個對象:的JavaScript修改對象屬性本身

var obj = { 
    'a|a' : 1, 
    'b|b' : 2 
} 

我想給obj更改爲類似:

var obj = { 
    'aa' : 1, 
    'bb' : 2 
} 

其中屬性a|a變更爲aa

有沒有辦法做同樣的事情?

+2

之前,我可以在一個有效的方式回答這個問題,究竟是什麼您期望的使用情況? – dbr

+0

[change property name]可能的重複(http://stackoverflow.com/questions/8483425/change-property-name) – aw04

+0

@DeanBrunt:我正在填充一個kendo網格,它不允許空格或任何特殊字符'field'屬性。我的服務器實際上是將'field'和'title'屬性翻譯成單個對象屬性,即'a | a'。最終我需要將屬性更改爲'aa'。 – Adithya

回答

3

有很多方法可以遍歷對象。我想最簡單的方法是使用一個for..in聲明:

for (let key in obj) { 
    console.log(key, '=>', obj[key]); 
} 

因此改變密鑰名稱將涉及使用String.replace更改密鑰名稱:

var obj = { 
 
    'a|a' : 1, 
 
    'b|b' : 2 
 
} 
 

 
let newObj = {}; 
 
for (let key in obj) { 
 
    if (obj.hasOwnProperty(key)) { 
 
     newObj[key.replace('|', '')] = obj[key]; 
 
    } 
 
} 
 

 
console.log(newObj);

如果你不不想創建新對象,可以添加新密鑰並delete obj[key]

for (let key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     obj[key.replace('|', '')] = obj[key]; 
     delete obj[key]; 
    } 
} 

另一種方法是使用Array.reduce在鍵/屬性:

Object.getOwnPropertyNames(obj).reduce((p, c) => { 
    p[c.replace('|', '')] = obj[c]; 
    return p; 
}, {}); 
+0

你能解釋一下什麼是 obj [key.replace('|','')] = obj [key]; – Adithya

+1

當然,'key'看起來像''a | a「',所以'key.replace('|','')'會產生''aa''。 obj ['a | a']'(或'obj [key]')的值是1,所以這看起來像是'obj ['aa'] = obj ['a | a']'或'obj ['aa'] = 1' –

+0

obj [key.replace('|','')]在現有對象內創建一個新鍵,'= obj [c]'將'obj [c]'的值賦值給新鑰匙?這種行爲是由於字符串的不變性嗎?這是我們必須刪除舊密鑰的原因嗎? – Adithya

4

你可以這樣說:

Object.getOwnPropertyNames(obj).forEach(function (key) { 
    obj[key.replace('|', '')] = obj[key]; 
    delete obj[key]; 
}); 

簡單地通過所有對象鍵循環和值分配給新的密鑰(不| characted),事後刪除舊的密鑰。

+1

這是一個很好的解決方案。我也建議'Object.getOwnPropertyNames()'而不是'Object.keys()'忽略可枚舉性...... – Badacadabra

+1

確實,我的答案會更新。感謝您指出,不知道這種差異。 –

+0

那麼,你用'Object.keys()'的解決方案是完全有效的。這只是一個建議,你不必編輯你的代碼。 ;) – Badacadabra

3
 var obj = { 
      'a|a': 1, 
      'b|b': 2 
     } 

     let keys = Object.keys(obj); 
     let newObj = {}; 
     for (let key of keys) { 
      let transformedKey = key.replace("|","") ; // transform your key 
      newObj[transformedKey] = obj[key] 
     } 

     console.log(newObj); 

這是修復你的用例。