Digamos que tengo las siguientes 2 matrices:
let a = [5,5,5,5,0] let b = [5,5,5,5,0]Suponiendo que ambas matrices tienen la misma longitud:
Quiero obtener un valor de un elemento de una matriz y agregar el +1 a sí mismo y a otros elementos restantes. Si el valor seleccionado sigue siendo mayor que cero, también debe continuar agregándolo a los elementos de otra matriz desde el índice inicial.
Ejemplo_1: si elijo a[2] , el resultado debería ser:
a = [5,5,1,6,1] // a[2] became 0 after picking 5, then in each remaining element we add +1 and continue to next array. b = [6,6,5,5,0] Example_2: O si elijo b[3] de las matrices iniciales, entonces el resultado debería ser:
a = [6,6,6,5,0] // b[3] became 0 after picking 5, then in each remaining element we add +1 and move to next array until our value becomes zero b = [5,5,5,1,1]Aquí está mi intento:
let pickedValue = a[2] for (let index = 2; index < a.length; index++) { if (pickedValue > 0) { a[index] += 1 pickedValue-- } } for (let index = 0; index < pickedValue; index++) { if (pickedValue > 0) { b[index] += 1 pickedValue-- } }¿Podemos hacer esto de una manera más dinámica con tal vez un ciclo?
Puede tomar un objeto con las propiedades de matrices con el mismo nombre y entregar la clave y el índice de destino y luego actualizar hasta que no haya más valor para dispersar.
const update = (source, target, index) => { const keys = Object.keys(source); let value = source[target][index]; source[target][index] = 0; while (value--) { source[target][index++]++; if (index === source[target].length) { index = 0; target = keys[(keys.indexOf(target) + 1) % keys.length]; } } return source; }; console.log(update({ a: [5, 5, 5, 5, 0], b: [5, 5, 5, 5, 0] }, 'a', 2)); console.log(update({ a: [5, 5, 5, 5, 0], b: [5, 5, 5, 5, 0] }, 'b', 3)); .as-console-wrapper { max-height: 100% !important; top: 0; }Solo necesita iterar a través de ambas matrices. La matriz elegida debe iterarse desde el target + 1 hasta su longitud, y la otra matriz, desde 0 hasta el target . Puede ver que coloco directamente un 1 en la matriz elegida en el target del índice, en lugar de poner un 0 y agregar +1.
(También use algunas expresiones regulares para capturar el número entre paréntesis, de esta respuesta SO )
let a = [5,5,5,5,0] let b = [5,5,5,5,0] const ans = prompt("Pick an element (eg `a[2]` or `b[3]`)"); const [chosenArray, otherArray] = ans[0] === 'a' ? [a, b] : [b, a]; const target = parseInt(ans.match(/(?<=\[).+?(?=\])/), 10); chosenArray[target] = 1; for (let i = target + 1; i < chosenArray.length; ++i) ++chosenArray[i]; for (let i = 0; i < target; ++i) ++otherArray[i]; console.log(a, b)