2017-07-09 5 views
0

Ich denke nicht, dass das schwierig ist, ich kann einfach nicht den besten Weg finden, es zu tun. Diese Funktion erstellt ein Array aus einer Gruppe von Kontrollkästchen. Ich möchte dann das Array aufteilen und ein Array von Objekten erstellen, da jedes Objekt entsprechende Daten haben kann. Wie filtere ich bestehende rolesInterestedIn.roleType heraus.Herausfiltern von bestehenden Objekten in einem Array von Objekten

handleTypeOfWorkSelection(event) { 
    const newSelection = event.target.value; 
    let newSelectionArray; 

    if(this.state.typeOfWork.indexOf(newSelection) > -1) { 
     newSelectionArray = this.state.typeOfWork.filter(s => s !== newSelection) 
    } else { 
     newSelectionArray = [...this.state.typeOfWork, newSelection]; 
    } 
    this.setState({ typeOfWork: newSelectionArray }, function() { 
     this.state.typeOfWork.map((type) => { 
     this.setState({ 
      rolesInterestedIn: this.state.rolesInterestedIn.concat([ 
      { 
       roleType: type, 
      } 
      ]) 
     }, function() { 
      console.log(this.state.rolesInterestedIn); 
     }); 
     }) 
    }); 
    } 

UDPATE

rolesInterestedIn: [ 
    { 
    roleType: '', 
    experienceYears: '' 
    } 
], 
+0

Was ist das Problem mit diesem Code? Funktioniert es nicht wie erwartet, ist es besser, wenn Sie Beispieldaten bereitstellen, was Sie erwarten und was das Ergebnis dieser Methode ist. –

+0

'rolesInteressedIn' erstellt jedes Mal neue Objekte, wenn ich ein Kontrollkästchen an- oder abwähle. Ich möchte nicht, dass es nur "concat" anzeigt. Ich möchte, dass es nach Duplikaten sucht und dann bei Bedarf aktualisiert wird, indem die Auswahl hinzugefügt oder entfernt wird. – bp123

Antwort

1

Weil jedes Mal, wenn Sie setState tun Sie den neuen Wert in der einen i.Vj. verketten sind in rolesInterestedIn Array. Fügen Sie nur einen neuen Wert hinzu, wenn Sie ein neues Element hinzufügen, andernfalls entfernen Sie das Objekt aus der Statusvariablen typeOfWork und rolesInteressedIn.

Try this:

handleTypeOfWorkSelection(event) { 
    const newSelection = event.target.value; 
    let newSelectionArray, rolesInterestedIn = this.state.rolesInterestedIn.slice(0); 

    if(this.state.typeOfWork.indexOf(newSelection) > -1) { 
     newSelectionArray = this.state.typeOfWork.filter(s => s !== newSelection); 
     rolesInterestedIn = rolesInterestedIn.filter(s => s.roleType !== newSelection) 
    } else { 
     newSelectionArray = [...this.state.typeOfWork, newSelection]; 
     rolesInterestedIn = newSelectionArray.map((workType) => { 
      return { 
       roleType: workType, 
       experienceYears: '', 
      } 
     }); 
    } 
    this.setState({ 
     typeOfWork: newSelectionArray, 
     rolesInterestedIn: rolesInterestedIn 
    }); 
} 

Vorschlag: nicht mehr setState innerhalb einer Funktion verwenden Sie, alles tun, die Berechnung dann setState einmal verwenden, um alle Werte in den letzten zu aktualisieren.

+0

Kühl. Ich glaube nicht, dass ich das richtig implementiere. Sollte das mit dem Update funktionieren, das ich hinzugefügt habe? – bp123

+0

muss etwas geändert werden, sagen Sie mir eine Sache, was wird der Anfangswert von 'experienceYears' mit jedem roleType im' rolesInteressedIn' Array sein? –

+0

Anfangszustand ist null. Der Benutzer wird es in einem anderen Abschnitt auswählen. – bp123