1
votes

étape javascript à l'intérieur de l'objet à remplir avec une variable

J'essaye de pénétrer dynamiquement en profondeur dans un objet. L'objet children est inconnu et devrait plutôt être utilisé à partir d'une chaîne.

J'espère que vous pouvez voir ci-dessous ce que j'essaye de faire. J'ai commenté la partie où je n'arrive pas à trouver une solution.

this: {
  is: {
    a: {
      long: {
        url: "My text"
      }
    }
  }
}

Les résultats peuvent être quelque chose comme ceci:

var global_object = {};

function populate(id, text) {
  let parts = id.split('/');

  for(let key in parts) {
    let part = parts[key];
    // global_object['this']['is']['a']['long']['url'] = text;
    console.log(part);
  }
}

populate('this/is/a/long/url', 'My text');

https://jsfiddle.net/2f6kue74/

Les solutions ES6 sont également acceptées


6 commentaires

Copie possible de Javascript: Comment créer un objet à partir d'une chaîne séparée par des points?


la réponse à votre problème est similaire sinon la même ici: par @Tony bien que ce que vous faites soit considéré comme une mauvaise pratique. stackoverflow.com/ questions / 20424226 /…


@ElieNassif Merci! Pourquoi est-ce considéré comme une mauvaise pratique et quelle est l'alternative?


@ JensTörnell si vous renommez l'un des attributs dans un autre morceau de code, le code actuel ne sera pas fonctionnel. À moins que vous n'exerciez beaucoup de contrôle dessus. Je ne sais pas quel est le contexte de votre projet.


@ElieNassif J'essaie de générer une sorte d'API de fichier / dossier pour récupérer des fichiers et des dossiers depuis PHP avec ajax. L'idée est que lorsque j'envoie une URL ou un identifiant comme je l'appelle, il doit peupler cet objet imbriqué. Ensuite, je peux utiliser cet objet pour rendre un filetree en tant qu'éléments html de js.


@ JensTörnell si l'objet sert un seul but, je suppose que vous allez bien. je préférerais encore une fonctionnalité qui crée un seul niveau vide à la fois, et une autre qui définit une valeur au niveau pour garder les choses simples.


4 Réponses :


0
votes

Quelque chose comme ça devrait fonctionner. obj est l'objet courant à remplir et il est mis à jour à chaque itération de la boucle for .

let obj = global_object;
function populate(id, text) {
    let parts = id.split('/');

    for (let key in parts) {
        let part = parts[key];
        obj[part] = {};
        obj = obj[part];

    }
    obj = text;
}


0 commentaires

1
votes

vous pouvez faire quelque chose comme ça, stocker un var obj et mettre i dans une nouvelle clé à chaque tour. Ensuite, pour le texte, utilisez une autre variable pour "mémoriser" la dernière.

var global_object = {};

function populate(id, text) {
  let parts = id.split('/');
  let obj = global_object, last_obj, part;

  for(let key in parts) {
    part = parts[key];
    last_obj = obj;      
    obj[part] = {};
    obj = obj[part]
    console.log(part);
  }
  last_obj[part] = text;
}

populate('this/is/a/long/url', 'My text');
console.log(global_object);


0 commentaires

1
votes

Une autre solution récursive autonome sans variables externes

const populate = (id, text, result) => {
  const arr = id.split('/');
  let key = arr.shift();
  if(key) { 
    result[key] = {};
    if(!arr.length) { result[key] = text; }
    populate(arr.join("/"), text, result[key])
  }
  return result;
}

console.log(populate('this/is/a/long/url', 'My text', {}));


0 commentaires

0
votes

Ou réduisez-le

var global_object = {};

function populate(id, text) {
    global_object = id.split("/").reduceRight((acc, part) => {
        var nested = JSON.parse(JSON.stringify(acc));

        acc = {};
        acc[part] = nested;

        return acc;
    }, text);
}

populate("this/is/a/long/url", "My text");


0 commentaires