Comment convertir cet objet imbriqué en un objet plat?

Désolé, je ne sais pas comment formuler le titre de la question. Aidez-nous à modifier si possible.

J'ai un objet comme ceci:

{ a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } } 

Je veux faire ressembler à:

 { 'a': 'jack', 'b.c': 'sparrow', 'bde': 'hahaha' } // so that I can use it this way: a['bde'] 

JQuery est d'accord aussi. Je sais pour l'objet imbriqué, je peux utiliser abde pour obtenir la hahaha , mais aujourd'hui je dois l'utiliser comme a['bde'] -_- !!! Comment puis-je atteindre cet objectif? Merci d'avance 🙂

Vous pouvez utiliser une fonction récursive pour ramper l'objet et l'aplatir pour vous.

 var test = { a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }; function dive(currentKey, into, target) { for (var i in into) { if (into.hasOwnProperty(i)) { var newKey = i; var newVal = into[i]; if (currentKey.length > 0) { newKey = currentKey + '.' + i; } if (typeof newVal === "object") { dive(newKey, newVal, target); } else { target[newKey] = newVal; } } } } function flatten(arr) { var newObj = {}; dive("", arr, newObj); return newObj; } var flattened = JSON.stringify(flatten(test)); alert(flattened); 

Recursive est la meilleure solution pour cette affaire.

 function flatten(input, reference, output) { output = output || {}; for (var key in input) { var value = input[key]; key = reference ? reference + '.' + key : key; if (typeof value === 'object' && value !== null) { flatten(value, key, output); } else { output[key] = value; } } return output; } var result = flatten({ a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }); document.body.textContent = JSON.stringify(result); 

Une approche avec une fonction récursive, une itération sur les clés de l'objet et une recherche si la valeur est un objet. Dans l'affirmative, appelez la fonction mise à jour. Sinon, ajoutez la valeur trouvée à l'objet résultat.

 function getValues(o, a) { Object.keys(o).forEach(function (k) { if (typeof o[k] === 'object') { getValues(o[k], [].concat(a, k)); return; } result[[].concat(a, k).join('.')] = o[k]; }); } var object = { a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }, result = {}; getValues(object); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>'); 

Une autre implémentation récursive. J'avais l'impression d'écrire une mise en œuvre, même si les versions actuelles sont déjà très bonnes.

La fonction récursive vérifie si la clé est de type 'object' .

  • Si c'est un objet, on itère par la clé de chaque objet.
  • Sinon, nous l'ajoutons à notre objet résultat.
 function flat(res, key, val, pre = '') { const prefix = [pre, key].filter(v => v).join('.'); return typeof val === 'object' ? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res) : Object.assign(res, { [prefix]: val}); } return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {}); 

Forfait NPM plat

Ou vous pouvez simplement utiliser un paquet npm plat , une bibliothèque testée bien connue.

 var flatten = require('flat') flatten(obj); 

⬑ J'utiliserais cela dans un code sérieux.

[Extra] Neater appel à la fonction ci-dessus

 function flatObject(input) { function flat(res, key, val, pre = '') { const prefix = [pre, key].filter(v => v).join('.'); return typeof val === 'object' ? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res) : Object.assign(res, { [prefix]: val}); } return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {}); } const result = flatObject(input); 

Démo [Extra]

http://codepen.io/zurfyx/pen/VpErja?editors=1010

 function flatObject(input) { function flat(res, key, val, pre = '') { const prefix = [pre, key].filter(v => v).join('.'); return typeof val === 'object' ? Object.keys(val).reduce((prev, curr) => flat(prev, curr, val[curr], prefix), res) : Object.assign(res, { [prefix]: val}); } return Object.keys(input).reduce((prev, curr) => flat(prev, curr, input[curr]), {}); } const result = flatObject({ a: 'jack', b: { c: 'sparrow', d: { e: 'hahaha' } } }); document.getElementById('code').innerHTML = JSON.stringify(result, null, 2); 
 <pre><code id="code"></code></pre> 

Vous n'avez pas besoin de modifier, vous pouvez y accéder comme JsonObject.bc pour obtenir les données du champ c.

Consultez ce http://www.mkyong.com/javascript/how-to-access-json-object-in-javascript/ .