106 votes

Convertir les propriétés de l'objet JSON retourné en camelCase (première minuscule)

J'ai un JSON renvoyé par une API comme suit :

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

Pour rester cohérent avec mon style de code (camelCase - première lettre en minuscule), je veux transformer le tableau pour obtenir ce qui suit :

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

Quelle est la façon la plus simple et la plus efficace de procéder ? Créer un nouvel objet Contact et itérer sur tous les contacts dans le tableau retourné ?

var jsonContacts = json["Contacts"],
    contacts= [];

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

ou puis-je mapper le tableau original ou le transformer d'une manière ou d'une autre ?

128voto

m01 Points 1368

Si vous souhaitez utiliser lodash à la place de l'underscore, voici ce qu'il faut faire :

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

Cela permettrait de convertir les deux TitleCase y snake_case a camelCase . Notez qu'il n'est pas récursif.

108voto

remus Points 6305

Voici une fonction récursive fiable qui permet de mettre correctement en majuscules toutes les propriétés d'un objet 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
}

Test :

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

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

Sortie :

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

64voto

jeshio Points 435

Vous pouvez le faire avec cette fonction récursive (avec lodash et ES6) :

import { camelCase } from 'lodash';

const camelizeKeys = (obj) => {
  if (Array.isArray(obj)) {
    return obj.map(v => camelizeKeys(v));
  } else if (obj != null && obj.constructor === Object) {
    return Object.keys(obj).reduce(
      (result, key) => ({
        ...result,
        [camelCase(key)]: camelizeKeys(obj[key]),
      }),
      {},
    );
  }
  return obj;
};

Test :

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

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

Sortie :

{  
   "firstName": "John",
   "lastName": "Smith",
   "birthDate": "2018-05-31T09:03:57.844Z",
   "arrayTest":[  
      "one",
      "TWO",
      3
   ],
   "thisKey":{  
      "thisSubKey": 42
   }
}

25voto

goredwards Points 1441

Pour modifier les clés d'un objet simple de snake_case a camelCase récursivement essayez ce qui suit
(qui utilise 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;
};

dans le cadre de ce PLUNKER

Note : fonctionne également de manière récursive pour les objets à l'intérieur d'un tableau

16voto

guatedude2 Points 148

En utilisant lodash et ES6, ceci remplacera toutes les clés récursivement en camelcase :

const camelCaseKeys = (obj) => {
  if (!_.isObject(obj)) {
    return obj;
  } else if (_.isArray(obj)) {
    return obj.map((v) => camelCaseKeys(v));
  }
  return _.reduce(obj, (r, v, k) => {
    return { 
      ...r, 
      [_.camelCase(k)]: camelCaseKeys(v) 
    };
  }, {});
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X