1
votes

comment afficher les messages de groupe

Aidez-moi, je suis nouveau dans la réaction. Je rend les valeurs d'un objet imbriqué. Chaque objet a une propriété de titre et de message. Les titres peuvent être identiques. Je veux afficher les messages sous le titre. Si le titre est identique à celui de l'objet previos, ne l'affichez pas, une seule fois. Mais dans mon cas, il s'affiche après chaque message.

mon objet:

   title
     message
   title
     message
   title
     message

   title2
     message
   title2
     message

<div>
          {arrayOfMessages.map((item, idx) => {
            const {
              message,
              title
            } = item
            return (
              <div key={idx} className="message-content">
                <p>{title}</p>
                <p>{message}</p>
              </div>
            )
          })}
        </div>

résultat attendu:

   title
     message
     message
     message

   title2
     message
     message

dans mon cas:

arrayOfMessages=[
  {
    title: 'cars',
    message: 'toyota'
  },
  {
    title: 'cars',
    message: 'ford'
  },
  {
    title: 'cars',
    message: 'bmw'
  },
  {
    title: 'bikes',
    message: 'suzuki'
  },
  {
    title: 'bikes',
    message: 'bmw'
  },
]


3 commentaires

pouvez-vous partager votre structure d'objet?


Vous devez regrouper votre arrayOfMessages en fonction du titre (ou peut-être d'un autre identifiant). Il existe des bibliothèques telles que lodash qui vous facilitent la tâche, mais il existe également des extraits de code disponibles tels que gist.github.com/ramsunvtech/102ac0267d33c2cc1ccdf9158d0f7fca


@PrasannaBrabourame ajouté


5 Réponses :


0
votes

Une approche serait de regrouper les éléments de arrayOfMessages par le champ title , pour obtenir le résultat de rendu requis en utilisant le .reduce () code> méthode:

<div>
    { groupedMessages.map((group, idx0) => (<div key={idx0} className="message-content">
        <h2>{ group.title }</h2>
        { group.messages.map((message, idx1) => (<p key={idx1}>{message}</p>)) }        
        </div>))
    }
</div>

En utilisant le code ci-dessus, vous pouvez ensuite réviser votre méthode render () pour rendre le title une fois pour chaque catégorie d'élément:

XXX

J'espère que cela vous aidera!


0 commentaires

0
votes

Votre objet n'est pas bien structuré, devrait être comme ceci:

{
  arrayOfMessages.map((message, idx) => {
    const { description, title } = message
    return (
      <div key={idx} className="message-content">
        <p>{title}</p>
        {description.map((desc, index) => (
          <p key={index}>desc</p>
        ))}
      </div>
    )
  })
}

alors vous pouvez implémenter votre code comme ceci:

arrayOfMessages=[
  {
    title:"cars",
    description:["toyota","ford","bmw"]
  },
  {
    title:"bike",
    description:["suzuki","bmw"]
  }
]

p >


0 commentaires

0
votes

Vous devez d'abord créer vos données.

...
let renderMessages = {}
arrayOfMessages.forEach(message => {
  if (!renderMessages[message.title]) {
    renderMessages[message.title] = {
      title: message.title,
      messages: [message.message]
    }
  } else {
    renderMessages[message.title].messages.push(message.message)
  }
})

return (
  <div>
    {Object.keys(renderMessages).map(key => {
      let msg = renderMessages[key]
      return <div key={key} className="message-content">
        <p>{msg.title}</p>
        {msg.messages.map(content => <p key={content}>{content}</p>)} 
      </div>
    })}
  </div>
)


0 commentaires

0
votes

Vous pouvez regrouper les messages en fonction du titre en utilisant réduire . Ensuite, parcourez les entrées de l'objet fusionné pour obtenir le format souhaité

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="react"></div>

Voici une démonstration en direct:

class Sample extends React.Component {
  render() {
    const arrayOfMessages = [{ title: 'cars', message: 'toyota' }, { title: 'cars', message: 'ford' }, { title: 'cars', message: 'bmw' }, { title: 'bikes', message: 'suzuki' }, { title: 'bikes', message: 'bmw' },]

    const grouped = arrayOfMessages.reduce((acc, { title, message }) => {
      acc[title] = acc[title] || [];
      acc[title].push(message);
      return acc;
    }, {})

    return (
      <div>
        {
          Object.entries(grouped).map(([title, messages], i1) => (
            <div key={i1}>
              <h1>{title}</h1>
              { messages.map((message, i2) => (<p key={i2}>{message}</p>)) }
            </div>)
          )
        }
      </div>
    );
  }
}

// Render it
ReactDOM.render(
  <Sample />,
  document.getElementById("react")
);
const arrayOfMessages=[{title:'cars',message:'toyota'},{title:'cars',message:'ford'},{title:'cars',message:'bmw'},{title:'bikes',message:'suzuki'},{title:'bikes',message:'bmw'},]

const grouped = arrayOfMessages.reduce((acc, { title, message }) => {
  acc[title] = acc[title] || [];
  acc[title].push(message);
  return acc;
}, {})

console.log(grouped)


0 commentaires

-1
votes

essayez ceci

 render(){
   //title watcher
   let watcher = {};
   return   <div>
          {arrayOfMessages.map((item, idx) => {
            const {
              message,
              title
            } = item
             if(!watcher[title]){ 
                //update watcher with title
                //if watcher does not contain your title return title and message
                watcher[title]=title;
               return (
              <div key={idx} className="message-content">
                <p>{title}</p>
                <p>{message}</p>
              </div>
               )
             } else {
               //if watcher found with title return your message
                <div key={idx} className="message-content">
                <p>{message}</p>
              </div>
             }



          })}
        </div>

 }


1 commentaires

avez-vous compris @Yerlan Yeszhanov