2017-07-09 13 views
0

これは難しいとは思わないが、私はそれを行う最良の方法を理解できません。この関数は、チェックボックスのグループから配列を作成しています。私は、各オブジェクトが対応するデータを持つことができるので、配列を分割してオブジェクトの配列を作成したいと考えています。既存のrolesInterestedIn.roleTypeを除外するにはどうすればよいですか?オブジェクトの配列内の既存のオブジェクトをフィルタリングします。

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

このコードの問題点を教えてください。期待どおりに機能していない場合は、サンプルデータを提供すれば、期待していることと、このメソッドがどのような結果を出しているのかが分かります。 –

+0

'rolesInterestedIn'はチェックボックスを選択または選択解除するたびに新しいオブジェクトを作成します。私は、それが必要な場合は、選択を追加したり削除したりして、重複をチェックして更新したいと思っています。 – bp123

答えて

1

あなたがsetStateを行うたびに、あなたがrolesInterestedIn配列の前の1に新しい値を連結しているため。新しい項目を追加する場合にのみ新しい値を追加します。そうでない場合は、状態変数typeOfWorkとrolesInterestedInの両方からオブジェクトを削除します。

これを試してみてください:

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 
    }); 
} 

提案:は、最後のすべての値を更新するために、一度SETSTATEを使用して、関数内の複数のSETSTATEを使用するすべての計算をしないでください。

+0

クール。私はこれを正しく実装しているとは思わない。これは私が追加したアップデートで動作しますか? – bp123

+0

は何かを変更する必要があります、 'rolesInterestedIn'配列の各roleTypeを使って' experienceYears'の初期値はどうなるでしょうか? –

+0

初期状態はnullになります。ユーザーは別のセクションでそれを選択します。 – bp123

関連する問題