Estoy construyendo Yahtzee con React Redux. En mi reductor de puntajes, estoy calculando si otorgar o no los 30 puntos por una escalera pequeña según el estado de los dados. El estado de los dados se expresa como una matriz, por lo que tengo que detectar si esta matriz incluye o no 1, 2, 3, 4... 2, 3, 4, 5... o 3, 4, 5, 6. ¿Qué Se me ocurrió que funciona, pero se ve muy desordenado (abajo). ¿Existe una forma más limpia de verificar si estos conjuntos de valores aparecen dentro de una matriz?
setSmallStraight: (state, action) => { if ( action.payload.includes(1) && action.payload.includes(2) && action.payload.includes(3) && action.payload.includes(4) || action.payload.includes(2) && action.payload.includes(3) && action.payload.includes(4) && action.payload.includes(5) || action.payload.includes(3) && action.payload.includes(4) && action.payload.includes(5) && action.payload.includes(6) ) { state['Small Straight'] = 30 } else {state['Small Straight'] = 0} },Puede usar array.some() y array.every()
const small_straights = [ [1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6] ]; if (small_straights.some(dice => dice.every(die => action.payload.includes(die))) { state['Small Straight'] = 30; } else { state['Small Straight'] = 0; }Usando Array#some , Array#every y Set :
const _hasAll = (arr = [], nums = []) => { const set = new Set(arr); return nums.every(num => set.has(num)); } const shouldAward = ({ payload = [] }) => [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]].some(nums => _hasAll(payload, nums)); console.log( shouldAward({ payload: [1, 2, 3, 4] }) ); console.log( shouldAward({ payload: [2, 3, 4, 5] }) ); console.log( shouldAward({ payload: [3, 4, 5, 6] }) ); console.log( shouldAward({ payload: [4, 5, 6, 7] }) );