1
votes

manipulation avec des objets dans un tableau

C'est une tâche difficile pour moi. J'ai un tableau d'objets. J'ai besoin de faire une boucle à travers un tableau, s'il y a une clé "message", ajoutez-la à un nouveau tableau. Mais il y a une chose délicate ici. Si 'render' est vrai, je dois obtenir "stageID" (par exemple dans le premier élément stadeID = 3) et passer au troisième élément de ce tableau, obtenir 'message' s'il y en a un, l'ajouter à nouveau au tableau et vérifier pour l'état "render", continuez à boucler jusqu'à ce que le rendu soit faux. Si dans l'élément aucune clé 'message', mais que le rendu est vrai, je dois de toute façon passer aux éléments par son ID d'étape.

P / S J'ai toujours besoin de recevoir le message du premier élément, peu importe si le rendu est vrai ou non

displayData(step) {
  let arrayWithMessage=[]
      for (let z = 0; z < step.length; z++) {
        if ("message" in step[z]) {
          arrayWithMessage.push(step[z].message)
        }
        if (step[z].render === true) {
          console.log("reder true", step[step[z].stageID - 1])
        }
      }
  }

Voici ma fonction. J'ajoute le premier élément 'message' au tableau, en vérifiant 'render' mais je n'ai aucune idée de la façon dont il se déplace dans un tableau en utilisant 'stageID'

[
  {
    "algID": 0,
    "render": true,
    "message": "first message",
    "stageID": "3"
  },
  {
    "algID": 0,
    "render": false,
    "message": "second message",
    "message_type": "text"
  },
  {
    "algID": 0,
    "render": true,
    "message": "third message",
    "message_type": "text",
    "stageID": "5"
  },
  {
    "algID": 0,
    "render": false
  },
  {
    "algID": 0,
    "render": false,
    "stageID": "4"
  },
  {
    "algID": 0,
    "render": false
  }
]

résultat attendu: ['premier message', 'troisième message']


3 commentaires

Veuillez publier le résultat attendu


@adiga posté sous le code


que signifie "passer au troisième élément de ce tableau" ?, qu'arrive-t-il au "second message" ?


3 Réponses :


2
votes

Vous pouvez parcourir le tableau et prendre soit l'élément suivant, soit le stageID - 1 comme nouvel index.

var data = [{ algID: 0, render: true, message: "first message", stageID: "3" }, { algID: 0, render: false, message: "second message", message_type: "text" }, { algID: 0, render: true, message: "third message", message_type: "text", stageID: "5" }, { algID: 0, render: false }, { algID: 0, render: false, stageID: "4" }, { algID: 0, render: false }],
    result = [],
    i = 0;

while (data[i]) {
    if (data[i].message) result.push(data[i].message);
    if (data[i].render) {
        i = data[i].stageID - 1;
        continue;
    }
    i++;
}

console.log(result);


0 commentaires

0
votes

Laissez votre tableau est stocké dans la variable a

var messages = [];

function getMessage(index) {
    if (a[index - 1].message !== undefined) {
        messages.push(a[index - 1].message);
    }
    if (a[index - 1].render) {
        getMessage(a[index - 1].stageID);
    }
}

getMessage(1);


0 commentaires

0
votes

Modifier: stageID - 1 est-il l'index du prochain article lié? Si oui, cette solution ou Ninas est correct.

J'ai interprété Je dois obtenir "stageID" (par exemple dans le premier élément stadeID = 3) et passer au troisième élément de ce tableau comme, si stageID = 3, l'élément suivant est le 3ème élément du tableau.


Si j'ai bien compris la logique, quelque chose comme ça pourrait fonctionner:

Nous créons un fonction qui extraira tous les messages où render est vrai et un message existe.

Ensuite, nous pouvons simplement mapper ce tableau pour extraire les messages.

L'avantage étant que nous pouvons facilement utiliser dans une fonction de mappage pour faire cela pour tous les articles.

const posts = [
  { "algID": 0, "render": true, "message": "first message", "stageID": "3" },
  { "algID": 0, "render": false, "message": "second message", "message_type": "text" },
  { "algID": 0, "render": true, "message": "third message", "message_type": "text", "stageID": "5" },
  { "algID": 0, "render": false },
  { "algID": 0, "render": false, "stageID": "4" },
  { "algID": 0, "render": false }
];

const find_message_chain = post => {
  const index = parseInt( post.stageID ) - 1;
  // If we have render: true, we will need to look for the next post as well.
  // By recursively calling find_chain and concatenating all the results, we get a single, one lvel deep array instead of nested arrays we have to .flat() at the end.
  if ( post.render && post.message ) return [ post.message, ...find_message_chain( posts[ index ]) ];
  // If we do not have render true, but do have a message, this post will br the last one in the chain, so we return it.
  else if ( post.message ) return [ post.message ];
  // If no message exists, we do not want to return the post, since the chain ends.
  else return [];
};

const messages_for_post_0 = find_message_chain( posts[ 0 ] );

console.log( messages_for_post_0 );

const all_messages_per_post = posts.map( find_message_chain );

console.log( all_messages_per_post );

Sidenote 1: J'ajouterais un identifiant réel aux messages, donc nous n'avons pas à nous fier à l'index du tableau des données sources (articles) pour déterminer quel article est lié à quel autre article. p>

Note 2: La fonction de chaîne récursive peut facilement être rendue moins exacte pour permettre l'extraction arbitraire de n'importe quelle valeur, pas seulement des messages.


4 commentaires

stageID - 1 est - il l 'index du prochain article lié? Oui!


Que faire si render est vrai et que stageID le fait référence à l'élément où render est faux?


Si le stageID fait référence à un élément dont le rendu est faux, la chaîne s'arrête en ajoutant le message de ce dernier élément où le rendu était faux, selon votre description: si le rendu est vrai, ajoutez votre propre message et ajoutez le message de l'élément stageID fait référence à , s'il existe. Si le rendu est vrai sur l'élément stageID, continuez.


Donc, si vous n'avez qu'à ajouter des éléments où le rendu est vrai et le message existe, le code devient également plus facile. Mais alors votre description de la logique est encore plus multi-interprétable.