我有一個對象:的JavaScript修改對象屬性本身
var obj = {
'a|a' : 1,
'b|b' : 2
}
我想給obj
更改爲類似:
var obj = {
'aa' : 1,
'bb' : 2
}
其中屬性a|a
變更爲aa
。
有沒有辦法做同樣的事情?
我有一個對象:的JavaScript修改對象屬性本身
var obj = {
'a|a' : 1,
'b|b' : 2
}
我想給obj
更改爲類似:
var obj = {
'aa' : 1,
'bb' : 2
}
其中屬性a|a
變更爲aa
。
有沒有辦法做同樣的事情?
有很多方法可以遍歷對象。我想最簡單的方法是使用一個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;
}, {});
你能解釋一下什麼是 obj [key.replace('|','')] = obj [key]; – Adithya
當然,'key'看起來像''a | a「',所以'key.replace('|','')'會產生''aa''。 obj ['a | a']'(或'obj [key]')的值是1,所以這看起來像是'obj ['aa'] = obj ['a | a']'或'obj ['aa'] = 1' –
obj [key.replace('|','')]在現有對象內創建一個新鍵,'= obj [c]'將'obj [c]'的值賦值給新鑰匙?這種行爲是由於字符串的不變性嗎?這是我們必須刪除舊密鑰的原因嗎? – Adithya
你可以這樣說:
Object.getOwnPropertyNames(obj).forEach(function (key) {
obj[key.replace('|', '')] = obj[key];
delete obj[key];
});
簡單地通過所有對象鍵循環和值分配給新的密鑰(不|
characted),事後刪除舊的密鑰。
這是一個很好的解決方案。我也建議'Object.getOwnPropertyNames()'而不是'Object.keys()'忽略可枚舉性...... – Badacadabra
確實,我的答案會更新。感謝您指出,不知道這種差異。 –
那麼,你用'Object.keys()'的解決方案是完全有效的。這只是一個建議,你不必編輯你的代碼。 ;) – Badacadabra
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);
這是修復你的用例。
之前,我可以在一個有效的方式回答這個問題,究竟是什麼您期望的使用情況? – dbr
[change property name]可能的重複(http://stackoverflow.com/questions/8483425/change-property-name) – aw04
@DeanBrunt:我正在填充一個kendo網格,它不允許空格或任何特殊字符'field'屬性。我的服務器實際上是將'field'和'title'屬性翻譯成單個對象屬性,即'a | a'。最終我需要將屬性更改爲'aa'。 – Adithya