2013-06-27 56 views
3

我對JavaScript比較陌生,所以請原諒我這是愚蠢/不可能的,但我試圖在JavaScript對象中標準化屬性名稱。例如,我有代碼如搜索JavaScript屬性名稱中的字符

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

我想創建一個名爲firstName,middleName和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; 
} 

如果屬性名都已經是駝峯,他們將不會被正則表達式改變。

+1

這不會修復'convertName('MiddleName'); //「MiddleName」' –

+0

好點;只是意識到 – bokonic

+0

這不是在OP的例子,但你也會得到'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