Estoy tratando de crear una función que duplique cada 5 que se encuentran en la matriz proporcionada usando Array.prototype.forEach() y Array.prototype.splice():
function duplicateFives(array) { function multiplyFives (element, index) { if (element === 5) { array.splice(index, 0, 5); index++; } } array.forEach(multiplyFives); return array; }Sin embargo, parece que modificar el segundo parámetro del método .forEach no omite iteraciones (elementos). ¿Es esto correcto, o estoy cometiendo un error diferente?
Mdn no parece confirmar ni especificar ninguna funcionalidad relacionada con el parámetro de índice.
Si desea dividir una matriz en fragmentos de n elementos, Array.reduce puede ser una mejor idea.
const arr = [1,8,4,5,7,8,5,9,12,5,98,97,32,]; let chunks = arr.reduce( (a, v, i) => i && i%5 === 0 ? [...a, arr.slice(i-5, i)] : a, []); // remaining elements const remain = arr.slice(chunks.flat().length); if (remain.length) { chunks = chunks.concat([remain]); } console.log(`${JSON.stringify(chunks)}`);El index está limitado al alcance de la función multiplyFives() y no modificará el índice del bucle array.forEach() .
Con su código, cuando un nuevo elemento se empalma en la matriz en el siguiente índice, el array.forEach() verá ese elemento en la siguiente iteración y continuará empalmando el mismo elemento por la longitud restante de la matriz.
Se requiere un indicador de duplicate booleano para permitir la duplicación de 5 valores adyacentes e ignorar los valores que ya estaban duplicados.
Aquí está el código JavaScript correcto con comentarios que explican cada línea modificada.
const array = [1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10] console.log('Array without duplicated 5 values') console.log(array) function duplicateFives(array) { // Set a boolean flag to determine if a duplicate 5 should be made let duplicate = true function multiplyFives (element, index) { if (element === 5) { if (duplicate === true) { // Add a duplicate 5 to the array if the current element isn't from a previous duplication array.splice(index, 0, 5) // Prevent the duplicated 5 from duplicating itself in the next iteration duplicate = false } else { // Allow duplication for the next element with a value of 5 in the array duplicate = true } } } array.forEach(multiplyFives) return array } duplicateFives(array) console.log('Array with duplicated 5 values') console.log(array)No puede modificar una matriz mientras la itera con un bucle forEach, que solo proporciona variables locales, como el elemento actual y el índice. Esas son solo variables locales, modificarlas no afecta el ciclo dentro de forEach.
Lo que debe hacer es buscar índices para modificar y modificar la matriz en sí.
algo como:
function duplicateFives(array) { array.map((cur,index)=>cur === 5 ? index : undefined) // find indexes of 5's .filter(item=>item !== undefined) // filter undefined's .forEach((item,index) => array.splice(item + index, 0, 5)); // modify array for those items. // Adding new items to array changes indexes, take that into account. return array; } console.log(duplicateFives([1, 2, 3, 4, 5, 6, 7, 5, 8, 9, 10]));