2013-06-27 2 views
3

Я относительно новичок в JavaScript, поэтому, пожалуйста, простите меня, если это глупо/невозможно, но я пытаюсь стандартизировать имена свойств в объекте JavaScript. Например, у меня есть код, такие какпоиск символов в имени свойства JavaScript

var object = { 
    "firstName": "Joe", 
    "MiddleName": "Roy", 
    "last_name": "Fool" 
} 

Я хочу, чтобы создать новый объект, который имеет имена свойств ПгвЬЫата, ОТЧЕСТВО, и LastName. Есть ли способ поиска этих свойств и выяснить, какие из них являются нарушением? В противном случае я мог бы просто сделать полную копию, но это было бы довольно неэффективно. Благодаря

+0

"* Я хочу, чтобы новый объект *" всегда общая копия, что еще вы имеете в виду? – Bergi

+0

Вы не знаете, какие из них в нарушении обязательно, правильно? Вы ищете какой-то лингвистический парсер? – oooyaya

+1

Этот вопрос отвечает на то, как итерировать имя свойства trought объекта: http://stackoverflow.com/questions/85992/how-do-i-enumerate-the-properties-of-a-javascript-object –

ответ

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, они не будут изменены регулярным выражением.

+1

Это не исправляет 'convertName ('MiddleName'); // «MiddleName» ' –

+0

хорошая точка; просто понял, что – bokonic

+0

Это не было в примере OPs, но вы также получите 'convertName ('MIDDLE_NAME'); // «mIDDLENAME» ' –

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"} 
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"} 

На jsfiddle