Dejando a un lado las preocupaciones sobre la modificación de Array.prototype de JavaScript por ahora, ¿cómo haría para escribir un método personalizado en el prototipo de Array que devuelva un iterador a la inversa? Específicamente, me gustaría proporcionar un método entryReverse() que haga exactamente lo que hace Array.prototype.entries() excepto en orden inverso. Tengo una función a medida:
const entriesReverse = (array) => ({ [Symbol.iterator]() { let index = array.length; return { next: () => ({ value: [--index, array[index]], done: index < 0 }) } } })
pero estaré condenado si puedo descubrir cómo implementar esto como un método en el prototipo de Array existente. El problema parece estar tratando de referirse a 'esto' dentro del bloque Symbol.iterator; no se refiere a la matriz en sí, sino al iterador. ¿Alguna idea?
Será más fácil usar una función de generador. Llame al .entries()
original y conviértalo en una matriz de las entradas, luego itere hacia atrás sobre esa matriz y yield
cada elemento.
Array.prototype.entriesReverse = function*() { const entries = [...this.entries()]; for (let i = entries.length - 1; i >= 0; i--) { yield entries[i]; } }; for (const entry of ['a', 'b', 'c'].entriesReverse()) { console.log(entry); }
Otra opción:
Array.prototype.entriesReverse = function*() { yield* [...this.entries()].reverse(); }; for (const entry of ['a', 'b', 'c'].entriesReverse()) { console.log(entry); }