318 votes

Convertir une chaîne JavaScript en notation par points en référence d’objet

Étant donné un objet JS

 var obj = { a: { b: '1', c: '2' } }

et une chaîne

 "a.b"

comment puis-je convertir la chaîne en notation par points pour que je puisse y aller

 var val = obj.a.b

Si la chaîne n'était que 'a' , je pourrais utiliser obj[a] . Mais ceci est plus complexe. J'imagine qu'il existe une méthode simple mais elle échappe à l'heure actuelle.

107voto

Petar Ivanov Points 29530

Si vous pouvez utiliser lodash , il existe une fonction qui fait exactement cela :

_.get(objet, chemin, [valeur par défaut])

 var val = _.get(obj, "a.b");

31voto

DarkCrazy Points 384

Vous pouvez utiliser lodash.get

Après l'installation ( npm i lodash.get ), utilisez-le comme ceci :

 const get = require('lodash.get');

const myObj = { 
    user: { 
        firstName: 'Stacky', 
        lastName: 'Overflowy',
        list: ['zero', 'one', 'two']
    }, 
    id: 123 
};

console.log(get(myObj, 'user.firstName')); // outputs Stacky
console.log(get(myObj, 'id'));             // outputs 123
console.log(get(myObj, 'user.list[1]'));   // outputs one

// You can also update values
get(myObj, 'user').firstName = 'John';

25voto

joekarl Points 1490

Un exemple un peu plus compliqué avec la récursivité.

 function recompose(obj, string) {
  var parts = string.split('.');
  var newObj = obj[parts[0]];
  if (parts[1]) {
    parts.splice(0, 1);
    var newString = parts.join('.');
    return recompose(newObj, newString);
  }
  return newObj;
}

var obj = { a: { b: '1', c: '2', d:{a:{b:'blah'}}}};
console.log(recompose(obj, 'a.d.a.b')); //blah

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