Ahora mismo, esto no funciona.
const item = {name: "mike", apples: 20} const [list, setList] = useState([{name: "peter", apples: 30}, {name: "mike", apples: 39}]) setList(list.map(entry => entry.name == item.name ? entry.apples = item.apples+entry.apples : entry = entry))Puedo hacerlo funcionar con el siguiente código. Sé que no está limpio y es por eso que estoy tratando de hacer que el código superior funcione de la manera de reaccionar : usando es6 dentro del gancho useState.
let newList = [...list] let changed = false newList.map(entry => { if(entry.name == item.name) { entry.apples = item.apples+entry.apples } if(changed) { setList(newList) }Editar: también probé la actualización funcional en el estado como a continuación
setList(list => list.map(entry => entry.name == item.name ? entry.apples = item.apples+entry.apples : entry = entry))Esta es la forma correcta:
setList((previousList) => previousList.map((entry) => entry.name == item.name ? { ...entry, apples: entry.apples + item.apples } : entry ) ); entry.name == item.name ? entry.apples = item.apples+entry.apples no funcionará porque entry.apples = item.apples+entry.apples devuelve manzanas, pero cada elemento de la matriz debe seguir siendo un objeto y también debe asegurarse de que el estado no esté mutado ( entry.apples = ... is bad porque entry está mutada)