es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Extender el prototipo de Array de JavaScript con un método para iterar las entradas en orden inverso?

Dejando de lado las preocupaciones acerca de modificar Array.prototype de JavaScript por ahora, ¿cómo podría escribir un método personalizado en el Array prototype que devuelva un iterador en orden inverso? Específicamente, me gustaría proporcionar un método entriesReverse() que haga exactamente lo que hace Array.prototype.entries() excepto en orden inverso. He llegado hasta una función especializada:

const entriesReverse = (array) => ({
Symbol.iterator {
let index = array.length;
return {
next: () => ({
value: [–index, array[index]],
done: index < 0
})
}
}
})

pero no puedo averiguar cómo implementar esto como un método en el Array prototype existente. El problema parece ser intentar referirse a ‘this’ dentro del bloque Symbol.iterator: no se refiere al array en sí mismo, sino al iterador. ¿Alguna idea?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puede implementar el método entriesReverse() en el prototipo Array existente usando el método Array.prototype.entries() como referencia. El siguiente código debería hacer el truco:

    Array.prototype.entriesReverse = function() {
        let index = this.length;
        return {
            [Symbol.iterator]() {
                return {
                    next: () => ({
                        value: [--index, this[index]],
                        done: index < 0
                    })
                }
            }
        }
    }
    

    Ahora puede usar el método entriesReverse() en cualquier instancia de arreglo, así:

    const arr = [1, 2, 3, 4];
    const iterator = arr.entriesReverse();
    
    for (let entry of iterator) {
        console.log(entry);
    }
    

    Esto imprimirá la siguiente salida:

    [3, 4]
    [2, 3]
    [1, 2]
    [0, 1]
    

Comments are closed.