J'essaie de trouver un moyen de créer de manière dynamique un tableau contenant les chemins des propriétés les plus profondes d'un objet imbriqué. Par exemple, si mon objet est le suivant:
["userName", "email", "name.fullName", "name.split.first",...]
3 Réponses :
Vous pouvez utiliser p> array.pototype.fraTmap code> pour ceci -
const d =
{userName:[],email:[],name:{fullName:[],split:{first:[],last:[]}},date:{input:{split:{month:[],year:[]},full:[]},select:{month:[],year:[]}}}
const lookup = (o = {}, s = "") =>
s
.split(".")
.reduce
( (r, x) =>
r == null ? undefined : r[x]
, o
)
console.log(lookup(d, "name.split"))
// { first: [], last: [] }
console.log(lookup(d, "name.split.first"))
// []
console.log(lookup(d, "name.split.zzz"))
// undefined
console.log(lookup(d, "zzz"))
// undefined
et la prise en charge est limitée développeur.mozilla. org / fr-nous / docs / web / javascript / référence / ...
Je ne caractériserais pas le soutien comme «limité» simplement parce que ce n'est pas accessible à ~ 5%. Peut-être que ce n'est même pas utilisé dans un navigateur? Les développeurs JS construisant JS pour le Web connaissent (ou devront se familiariser avec des choses en polyfill. Cette discussion devrait-elle avoir lieu sur chaque question JS?
Il suffit de le noter que l'utilisateur ne va pas l'utiliser aveuglément.
@ user633183 merci beaucoup. Utilisation de la solution de notation de points ci-dessus, existe-t-il un moyen d'accéder à la valeur de ces propriétés? Par exemple. d.name.split.first code> à l'aide du tableau renvoyé en position 3?
@Noamsuissa, je pense que je comprends ce que vous demandez. J'ai mis à jour la réponse. Lmk si c'est ce que vous cherchez ^^
Il y a beaucoup de façons de le faire. Le plus facile est juste une récursion pour tester si vous avez un objet et boucle sur les touches sur les touches qui gardent la trace du chemin de chaque étape.
p>
var myObj = { userName: [], email: [], name: { fullName: [], split: { first: [], last: [] } }, date: { input: { split: { month: [], year: [] }, full: [] }, select: { month: [], year: [] } } } const setPath = (a, b) => a.length ? a + '.' + b : b const getAllPaths = (obj, paths=[], currentPath='') => { Object.entries(obj).forEach( ([key, value]) => { const updatedPath = setPath(currentPath, key) if (value instanceof Object && !Array.isArray(value)) { getAllPaths(value, paths, updatedPath) } else { paths.push(updatedPath) } }) return paths } console.log(getAllPaths(myObj))
Allez. Les tableaux et les objets sont fondamentalement la même chose. Il n'y a absolument pas besoin de chèques indéfinis. impression p> Array ["Nom d'utilisateur", "Email", "Nom", "Nom.fulname", "Nom.split", "Nom.split.First", "Nom.split.Last", "Date" "," date.input "," date.input.split "," date.input.split.month "," date.input.split.year "," date.input.full "," date.select "," date. Sélectionnez.Month "," date.select.year "] p>
blockQuote> p>
Solution brillante 🧐
@ Masoudmanson quand il s'agit de récursivité, j'aime garder les choses simples, car sinon mon cerveau commence à fondre ;-) mais ty.
@Holli je ne vois pas tout à fait la raison de "venir", mais merci beaucoup pour la solution
Ce n'était pas dirigé contre vous, mais mes collègues interrogateurs ;-)