Esta es mi función:
const multiSelect = value => { let tmpArr = [...selectedPeople]; if (tmpArr.length === 0) { tmpArr.push(value); } else { tmpArr.map(item => { if (item.id !== value.id) { tmpArr.push(value); } else { return; } }); } setSelectedPeople(tmpArr); }; Quiero verificar la matriz para el nuevo valor comparándolo con todos los elementos. Si value === item item, la función de bucle debería return , pero si el valor aún no está en la matriz, debería empujarlo.
Este es un gran problema para mí, pero supongo que es un pequeño problema para ustedes.
Use Array.every() para verificar si la matriz no contiene un elemento con la misma id :
const multiSelect = value => { const tmpArr = [...selectedPeople]; if(tmpArr.every(item => item.id !== value.id)) { tmpArr.push(value); } setSelectedPeople(tmpArr); }; Sin embargo, esto significa que está duplicando la matriz innecesariamente, mientras provoca una nueva representación, que no hará nada. Por lo tanto, verifique si el elemento ya forma parte de las personas selectedPeople mediante el uso de Array.some() , y si utiliza return para salir antes de la función. Si no es así, continúe con la clonación y actualice el estado:
const multiSelect = value => { if(tmpArr.some(item => item.id === value.id)) { return; } const tmpArr = [...selectedPeople]; tmpArr.push(value); setSelectedPeople(tmpArr); };Otro enfoque.
const multiSelect = value => setSelectedPeople([ ...selectedPeople, ...selectedPeople.some(({ id }) => id === value.id) ? [] : [value] ]);