1
votes

Comment fusionner deux tableaux d'objets avec reactjs?

J'ai un react-big-calendar , Je souhaite récupérer les événements de cette semaine depuis le backend et les autres semaines depuis le stockage local.

Mon code est:

componentDidMount() {
    fetch("url")
    .then(Response => Response.json())
      .then(data => {
        let evts = data;
        for (let i = 0; i < evts.length; i++) {
          evts[i].start = moment(evts[i].start).toDate();
          evts[i].end = moment(evts[i].end).toDate();
          this.state.evt1.push(evts[i])
        }                   
        this.setState({
          evt1: evts,
          prevEvents : evts
        })
      }) 
      console.log(this.state.evt1)
      const cachedHits = JSON.parse(localStorage.getItem('Evènements')) 
      console.log(cachedHits)
      for (let j = 0; j <cachedHits.length; j++) {
        cachedHits[j].start = moment(cachedHits[j].start).toDate();
        cachedHits[j].end = moment(cachedHits[j].end).toDate();
        this.state.evt2.push(cachedHits[j])
      }
    this.setState( {
      evt2: this.state.evt2
  })
    this.setState({
      events: [...this.state.evt1, ...this.state.evt2]
    })
  console.log(this.state.events)
  }

les événements code> est le tableau fusionné de evt1 (événements du backend) et evt2 (événements du stockage local), lorsque je l'exécute, je reçois sur ma console: p>

Les evt1 sont:

 entrez la description de l'image ici

Les evt2 sont:

entrer l'image description here

Mais, sur mon calendrier, seuls les evt2 sont affichés et pas tous les événements (evt1 et evt2).

Comment afficher tous les événements sur mon calendrier?


0 commentaires

4 Réponses :


2
votes

Essayez d'utiliser la méthode concat qui fonctionne peut-être.

this.setState({
      events: evt1.concat(evt2)
    })


2 commentaires

C'est toujours le même problème, seuls evt2 sont affichés


@ burak-gavas est probablement la voie à suivre



4
votes

Étant donné que vous effectuez un appel HTTP vers votre serveur, la récupération des données prend un certain temps. Au lieu de définir directement l'état des événements, vous devez attendre la réponse de votre appel HTTP. Votre code devrait être comme ceci:

componentDidMount() {
    fetch("url")
        .then(Response => Response.json())
        .then(data => {
            let evts = data;
            for (let i = 0; i < evts.length; i++) {
                evts[i].start = moment(evts[i].start).toDate();
                evts[i].end = moment(evts[i].end).toDate();
                this.state.evt1.push(evts[i])
            }
            this.setState({
                evt1: evts,
                prevEvents: evts
            })
        })
        .then(() => {

            console.log(this.state.evt1)
            const cachedHits = JSON.parse(localStorage.getItem('Evènements'))
            console.log(cachedHits)
            for (let j = 0; j < cachedHits.length; j++) {
                cachedHits[j].start = moment(cachedHits[j].start).toDate();
                cachedHits[j].end = moment(cachedHits[j].end).toDate();
                this.state.evt2.push(cachedHits[j])
            }
            this.setState({
                evt2: this.state.evt2
            })
            this.setState({
                events: [...this.state.evt1, ...this.state.evt2]
            })
            console.log(this.state.events)

        });
}

Je vous recommande également d'avoir un bloc catch dans votre chaîne de promesse pour gérer les erreurs.


0 commentaires

11
votes

Vous pouvez utiliser l'opérateur de propagation pour fusionner deux tableaux.

var a = [{fname : 'foo'}]
var b = [{lname : 'bar'}]
var c = [...a, ...b] // output is [{fname : 'foo'},{lname : 'bar'}]


2 commentaires

frustré pendant un certain temps, votre réponse m'a fait plaisir !! toujours confus sur la meilleure pratique de définir un état, un tableau d'objets ou un objet d'objet :(


Sur var b si j'ajoute simplement ce var b = [{fname: 'other'}] , notez que j'ai utilisé la même clé. Maintenant, il ne fait que fusionner à nouveau avec la même clé. Donc, la sortie est comme: // [{fname: 'foo'}, {fname: 'other'}] . Je ne sais pas comment mettre à jour la valeur uniquement.



1
votes

Ajoutez state.evt1 sur evts, puis parcourez les données que vous obtenez de fetch, apportez des modifications à l'élément actuel à l'intérieur de la boucle for, poussez l'élément vers evts puis ajoutez cela evts à l'état

        let evts = this.state.evt1;
        for (let i = 0; i < data.length; i++) {
          data[i].start = moment(data[i].start).toDate();
          data[i].end = moment(data[i].end).toDate();
          evts.push(data[i])
        }                   
        this.setState({
          evt1: evts
        })


0 commentaires