2017-04-21 104 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); 

这是修复你的用例。