1. ホーム
  2. javascript

[解決済み] 返されたJSONオブジェクトのプロパティを(小文字の)キャメルケースに変換する

2023-06-19 20:57:55

質問

APIからこのようなJSONが返されました。

Contacts: [{ GivenName: "Matt", FamilyName: "Berry" }]

これを私のコードスタイル(camelCase - 小文字の頭文字)と一致させるために、配列を変換して次のようにしたいと思います。

 contacts: [{ givenName: "Matt", familyName: "Berry" }]

これを行うための最も簡単で最良の方法は何ですか?新しいContactオブジェクトを作成し、返された配列内のすべての連絡先を繰り返し処理するのですか?

var jsonContacts = json["Contacts"],
    contacts= [];
        
_.each(jsonContacts , function(item){
    var contact = new Contact( item.GivenName, item.FamilyName );
    contacts.push(contact);
});

とか、元の配列をマッピングしたり、何らかの形で変換することは可能でしょうか?

どのように解決するのですか?

ここに、JavaScriptオブジェクトのすべてのプロパティを適切にキャメルケース化する、信頼性の高い再帰的な関数があります。

function toCamel(o) {
  var newO, origKey, newKey, value
  if (o instanceof Array) {
    return o.map(function(value) {
        if (typeof value === "object") {
          value = toCamel(value)
        }
        return value
    })
  } else {
    newO = {}
    for (origKey in o) {
      if (o.hasOwnProperty(origKey)) {
        newKey = (origKey.charAt(0).toLowerCase() + origKey.slice(1) || origKey).toString()
        value = o[origKey]
        if (value instanceof Array || (value !== null && value.constructor === Object)) {
          value = toCamel(value)
        }
        newO[newKey] = value
      }
    }
  }
  return newO
}

テストします。

var obj = {
  'FirstName': 'John',
  'LastName': 'Smith',
  'BirthDate': new Date(),
  'ArrayTest': ['one', 'TWO', 3],
  'ThisKey': {
    'This-Sub-Key': 42
  }
}

console.log(JSON.stringify(toCamel(obj)))

出力します。

{
    "firstName":"John",
    "lastName":"Smith",
    "birthDate":"2017-02-13T19:02:09.708Z",
    "arrayTest": [
        "one", 
        "TWO", 
        3
    ],
    "thisKey":{
        "this-Sub-Key":42
    }
}