我对JavaScript比较陌生,所以请原谅我,如果这是愚蠢/不可能的,但我正在尝试标准化JavaScript对象中的属性名称。例如,我有代码,如
var object = {
"firstName": "Joe",
"MiddleName": "Roy",
"last_name": "Fool"
}
我想创建一个具有属性名firstName,middleName和lastName的新对象。有没有办法搜索这些属性,看看哪些属性违反?否则,我总是可以制作一个完整的副本,但这样效率很低。感谢
答案 0 :(得分:1)
这可能超出了你想要的范围,但将下划线分隔的命名转换为camelcase非常容易;你可以迭代你的对象并生成一个具有正确名称的新对象:
var converter = /_(\w)/g, lowerFirst = /^(\w)/;
function convertName(name) {
if (converter.test(name)) {
name = name.toLowerCase().replace(converter, function ($0, $1) {
return $1.toUpperCase();
});
} else {
// correct a first letter being uppercase
name = name.replace(lowerFirst, function ($0, $1){ return $1.toLowerCase(); });
}
return name;
}
var hasOwnProperty = Object.prototype.hasOwnProperty,
toString = Object.prototype.toString;
function isPlainObject(obj) {
return toString.call(obj) === '[object Object]';
}
function convertObject(obj) {
var k, output = {};
for(k in obj) {
if (hasOwnProperty.call(obj, k)) {
output[convertName(k)] = isPlainObject(obj[k]) ? convertObject(obj[k]) : obj[k];
}
}
return output;
}
如果属性名称已经在camelcase中,则regexp不会更改它们。
答案 1 :(得分:0)
通过您的示例,一种快速方法是使用字典将属性值映射到第二个对象,以选择由(例如)Object.getOwnPropertyNames
var object = {"firstName": "Joe", "MiddleName": "Roy", "last_name": "Fool"};
var p = Object.getOwnPropertyNames(object), // ["firstName", "MiddleName", "last_name"]
dict = {
'firstname': 'firstName',
'first_name': 'firstName',
'middlename': 'middleName',
'middle_name': 'middleName',
'lastname': 'lastName',
'last_name': 'lastName'
},
o2 = {}, i;
for (i = 0; i < p.length; ++i) {
o2[dict[p[i].toLowerCase()] || p[i]] = object[p[i]];
}
o2; // {firstName: "Joe", middleName: "Roy", lastName: "Fool"}
答案 2 :(得分:0)
你可能会做这样的事情。
第一个replace
可用于替换您想要成为上套骆驼套管标记的任何字符。
第二个replace
在标记后面的字母上执行骆驼外壳。
最终replace
确保标识符的第一个字母为小写。
standardiseProperties
使用object
的规则在camelCase
上运行。但你也可以让它返回新对象standardised
。
如果名称不能使用,因为它已经存在,则使用原始名称。
我没有花太多时间在这上面,可能会有很好的优化,或者你可能希望稍微改变规则。
的Javascript
function camelCase(string) {
return string.replace(/[-+]/g, "_").replace(/_([\da-z])/gi, function (all, letter) {
return letter.toUpperCase();
}).replace(/^([A-Z])/, function (all, letter) {
return letter.toLowerCase();
});
}
function standardiseProperties(object) {
var standardised = {},
newName,
i;
for (i in object) {
if (object.hasOwnProperty(i)) {
newName = camelCase(i);
if (standardised.hasOwnProperty(newName)) {
standardised[i] = object[i];
} else {
standardised[newName] = object[i];
}
delete object[i];
}
}
for (i in standardised) {
object[i] = standardised[i];
}
}
var object = {
"firstName": "Joe",
"MiddleName": "Roy",
"last_name": "Fool"
};
console.log(object);
standardiseProperties(object);
console.log(object);
输出
Object {firstName: "Joe", MiddleName: "Roy", last_name: "Fool"}
Object {firstName: "Joe", middleName: "Roy", lastName: "Fool"}
上