Tengo una matriz de objetos como: [{}, {}, {}, {}, {}]; También tengo una función que es recursiva y acepta una función como parámetro:
function recursiveFunction(getResponse) { const result = getResponse(); const conditionMet = check(result); if(conditionMet) { return result; } return recursiveFunction(getResponse); } ¿Cómo puedo crear una función getResponse para que cada vez que se llame en recursiveFunction devuelva la próxima iteración de mi matriz?
Por ejemplo, en cada recursión debería obtener el siguiente objeto en la matriz:
function getResponse(index) { return array[index ++]; }Y cuando lo llamo:
const firstIndex = -1; // Because index ++ in function const result = recursiveFunction(getResponse(firstIndex));Entiendo por qué solo devuelve el primer valor, pero no estoy seguro de cómo puedo modificarlo para devolver el siguiente índice en la matriz al llamarlo nuevamente.
La forma de hacer esto en JavaScript sería usar el Protocolo de iteración incorporado:
const myinput = [ {a:1}, {b:2}, {c:3}, {d:4} ] const it = myinput.values() console.log(it.next()) console.log(it.next()) console.log(it.next()) console.log(it.next()) console.log(it.next()) {value: {a:1}, done: false} {value: {b:2}, done: false} {value: {c:3}, done: false} {value: {d:4}, done: false} {value: undefined, done: true} Podría hacer su propia función de iter que devuelva una función como la que describe:
function iter(iterable) { const it = iterable.values() return () => it.next().value } const inputA = [1,2,3] const inputB = ["a","b","c"] const nextA = iter(inputA) const nextB = iter(inputB) console.log(nextA()) // 1 console.log(nextA()) // 2 console.log(nextB()) // "a" console.log(nextB()) // "b' console.log(nextA()) // 3 console.log(nextB()) // "c" console.log(nextA()) // undefined console.log(nextB()) // undefined En su programa, deberá verificar si no está undefined para saber cuándo no quedan valores:
function recursiveCheck(check, getResponse) { const result = getResponse() if (result === undefined) return "not found" else if (check(result)) return "condition met" else return recursiveCheck(check, getResponse) } const output = recursiveCheck(myChcek, iter([{...}, {...}, ...])) console.log(output) El uso de la recursividad en estos casos particulares significa que el tamaño de su entrada será limitado. Si simplemente usa for..of de todos sus problemas desaparezcan -
function iterativeCheck(check, iterable) { for (const result of iterable) if (check(result)) return "condition met" return "not found" } const output = iterativeCheck(myCheck, [{...}, {...}, {...}, ...]) console.log(output)Consulte también Symbol.asyncIterator para saber cómo se puede usar este enfoque en iterables asincrónicos.
Debería pasar la función como argumento, no llamar a la función.
const result = recursiveFunction(getResponse); Además, si inicializa el índice como -1 , debe usar ++index , no index++ .