Возможно, вы можете сделать что-то подобное.
Первый 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"}
На jsfiddle
"* Я хочу, чтобы новый объект *" всегда общая копия, что еще вы имеете в виду? – Bergi
Вы не знаете, какие из них в нарушении обязательно, правильно? Вы ищете какой-то лингвистический парсер? – oooyaya
Этот вопрос отвечает на то, как итерировать имя свойства trought объекта: http://stackoverflow.com/questions/85992/how-do-i-enumerate-the-properties-of-a-javascript-object –