0

I'm creating new array with objects checked in the checkbox. But when i submit again, there's a error "flattenChildren(...): Encountered two children with the same key, .$3. Child keys must be unique; when two children share a key, only the first child will be used." I want push only unique objects.

I`m using react

handleSubmit(){

    let students = []
    for(let idx in this.state.checked){
        if(this.state.checked[idx] ){
            students.push(this.state.allStudent[idx])
        }
    }
    console.log('students', students)
    this.setState({
        studentList: update(this.state.studentList, {$push: students})
    })

}
4
  • Sorry i'm a newbie. Thank you for help! Commented Sep 6, 2019 at 9:50
  • you don't need to be sorry for not knowing things. as for the question, just before u push to state .. do a find and if u find skip the push lik ... a Array.findIndex((i)=>{ return children.id === currentchild.id}) and u should be good to go Commented Sep 6, 2019 at 9:53
  • Consider using a Set instead of an Array : their add method is idempotent for a given parameter Commented Sep 6, 2019 at 9:54
  • Change students.push(this.state.allStudent[idx]) to !students.includes(this.state.allStudent[idx]) && students.push(this.state.allStudent[idx]) Commented Sep 6, 2019 at 9:55

2 Answers 2

3

As you are using React, you should be able to safely use the ES6 Set Object, which lets you store unique values of any type. (https://devdocs.io/javascript/global_objects/set).

e.g.

handleSubmit(){

let students = []
for(let idx in this.state.checked){
    if(this.state.checked[idx] ){
        students.push(this.state.allStudent[idx])
    }
}

students = [...new Set(students)];

console.log('students', students)
this.setState({
    studentList: update(this.state.studentList, {$push: students})
})

}

Sign up to request clarification or add additional context in comments.

Comments

1

I am not an expert in React.js, but this seems to be a simple problem(pushing only unique elements to a JS array). Your function modified as follows should work:

handleSubmit(){
    let students = [...this.state.studentList];
    for(let idx in this.state.checked){
        if(this.state.checked[idx] && (students.indexOf(this.state.checked[idx]) === -1)){
            students.push(this.state.allStudent[idx])
        }
    }
    console.log('students', students)
    this.setState({
        studentList: update(this.state.studentList, students)
    })
}

What we have essentially done here is use the 'indexOf()' method on the 'students' array to check if the current element exists in the array - the indexOf() method returns -1 if an element is not found in an array. Hope this helps!

1 Comment

Yeah that's totally what i'm thinking. But it still throws "flattenChildren(...): Encountered two children with the same key" error. I don't know why.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.