function dropElements(arr, func) { let output = arr.reduce((acc=[], elem) => { if (func(elem)){ acc.push(arr.slice(arr.indexOf(elem))) return acc } }, []) return output } let tester = dropElements([1, 2, 3, 4,5,6,3,2,1], function(n) {return n >= 3;}) console.log(tester)Quiero que genere [3,4,5,6,3,2,1]. Pero está imprimiendo copias de matrices decrecientes de tamaño.
La declaración del problema: "Dada la matriz arr, itere y elimine cada elemento comenzando desde el primer elemento (el índice 0) hasta que la función func devuelva verdadero cuando el elemento iterado se pasa a través de él".
Puede usar Array#slice junto con Array#findIndex para encontrar el primer índice en el que la función de devolución de llamada devuelve true .
function dropElements(arr, func) { const idx = arr.findIndex(func); return idx >= 0 ? arr.slice(idx) : []; } console.log(dropElements([1, 2, 3, 4, 5, 6, 3, 2, 1], n => n >= 3)); Si desea usar específicamente Array#reduce , puede usar una variable para almacenar si la devolución de llamada se ha vuelto verdadera o no para cualquier elemento hasta el momento.
function dropElements(arr, func) { let found = false; return arr.reduce((acc, elem) => { found = found || func(elem); if (found) acc.push(elem); return acc; }, []); } console.log(dropElements([1, 2, 3, 4, 5, 6, 3, 2, 1], n => n >= 3));Utilice el método shift para eliminar el primer elemento de la matriz hasta que la matriz esté vacía o func(arr[0]) devuelva un valor verdadero. Este método es tan ineficiente como podría ser, pero coincide con el enunciado del problema. Particularmente:
function dropElements(arr, func) { while (arr.length > 0 && !func(arr[0])) { arr.shift(); } return arr; } let tester = dropElements([1, 2, 3, 4,5,6,3,2,1], function(n) {return n >= 3;}); console.log(tester);