84

私は次のような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);
});

または、元の配列をマップしたり、何らかの方法で変換したりできますか?

4

21 に答える 21

114

アンダースコアの代わりにlodashを使用すると、次のようになります。

_.mapKeys(obj, (v, k) => _.camelCase(k))

TitleCaseこれにより、との両方が に変換snake_caseされcamelCaseます。ただし、再帰的ではないことに注意してください。

于 2015-09-07T15:08:26.707 に答える
96

以下は、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
    }
}
于 2014-10-06T11:38:07.730 に答える
22

プレーン オブジェクトのキーを から に変更するには、次のsnake_caseことをcamelCase 再帰的に試してください
(これはLodashを使用します)。

function objectKeysToCamelCase(snake_case_object) {
  var camelCaseObject = {};
  _.forEach(
    snake_case_object,
    function(value, key) {
      if (_.isPlainObject(value) || _.isArray(value)) {     // checks that a value is a plain object or an array - for recursive key conversion
        value = objectKeysToCamelCase(value);               // recursively update keys of any values that are also objects
      }
      camelCaseObject[_.camelCase(key)] = value;
    }
  )
  return camelCaseObject;
};

このPLUNKERでテスト

: 配列内のオブジェクトに対しても再帰的に機能します

于 2017-02-01T23:31:42.203 に答える
2

さて、私は挑戦を始めて、それを理解したと思います:

var firstToLower = function(str) {
    return str.charAt(0).toLowerCase() + str.slice(1);
};

var firstToUpper = function(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
};

var mapToJsObject = function(o) {
    var r = {};
    $.map(o, function(item, index) {
        r[firstToLower(index)] = o[index];
    });
    return r;
};

var mapFromJsObject = function(o) {
    var r = {};
    $.map(o, function(item, index) {
        r[firstToUpper(index)] = o[index];
    });
    return r;
};


// Map to
var contacts = [
    {
        GivenName: "Matt",
        FamilyName: "Berry"
    },
    {
        GivenName: "Josh",
        FamilyName: "Berry"
    },
    {
        GivenName: "Thomas",
        FamilyName: "Berry"
    }
];

var mappedContacts = [];

$.map(contacts, function(item) {
    var m = mapToJsObject(item);
    mappedContacts.push(m);
});

alert(mappedContacts[0].givenName);


// Map from
var unmappedContacts = [];

$.map(mappedContacts, function(item) {
    var m = mapFromJsObject(item);
    unmappedContacts.push(m);
});

alert(unmappedContacts[0].GivenName);

プロパティコンバーター (jsfiddle)

秘訣は、オブジェクトをオブジェクト プロパティの配列として処理することです。

于 2012-10-17T10:55:07.437 に答える
0

goredwardsの回答に基づいて構築しています(配列フィールドを正しく処理していませんでした)

function objectKeysToCamelCase(snake_case_object) {
  let camelCaseObject = {}
  _.forEach(
    snake_case_object,
    function(value, key) {
      if (_.isPlainObject(value)) {
        value = objectKeysToCamelCase(value)
      } else if (_.isArray(value)) {
        value = value.map(v => _.isPlainObject(v) ? objectKeysToCamelCase(v) : v)
      }
      camelCaseObject[_.camelCase(key)] = value
    },
  )
  return camelCaseObject
}
于 2019-08-01T14:42:13.637 に答える
0

https://plnkr.co/edit/jtsRo9yU12geH7fkQ0WL?p=previewからの参照を使用してコードを更新しまし た

function snakeToCamelCase(snake_case_object){
  var camelCaseObject;
  if (isPlainObject(snake_case_object)) {        
    camelCaseObject = {};
  }else if(isArray(snake_case_object)){
    camelCaseObject = [];
  }
  forEach(
    snake_case_object,
    function(value, key) {
      if (isPlainObject(value) || isArray(value)) {
        value = snakeToCamelCase(value);
      }
      if (isPlainObject(camelCaseObject)) {        
        camelCaseObject[camelCase(key)] = value;
      }else if(isArray(camelCaseObject)){
        camelCaseObject.push(value);
      }
    }
  )
  return camelCaseObject;  
}
于 2017-09-10T09:57:00.113 に答える