Objeto iterable JS

ES6 introduce el concepto de iteradores y objetos iterables, y proporciona soporte relacionado para objetos iterables, como bucle for...of, constructor Map (iterable), sintaxis de expansión... etc. Simplifiquemos también en gran medida la operación transversal de la recopilación de datos fuera de la matriz.

 objeto iterable

Una matriz es un objeto especial, y su diferencia con los objetos ordinarios no es solo el acceso secuencial y el almacenamiento de elementos. Otra diferencia importante: los arreglos son iterables, es decir, se for ... ofpuede acceder a todos los elementos (iterar) usando declaraciones.

La declaración de uso de objetos ordinariosfor ... of informará un error

let arr = [1,2,3,4,5]
for(let val of arr) {
    console.log(val)  // 1 2 3 4 5
}

let obj = {
    name:'Kite',
    age:23,
}
for(let key of obj) { // obj is not iterable
    console.log(key)
}

operador de propagación 

// es5 apply
function consoleLog() {
  console.log(...arguments)
}
console.log(consoleLog.apply(null, array))

// es6 扩展预算符
const array = [1, 2, 3, 4]
console.log(...array); // 1,2,3,4


const obj = {
  name: 'kite',
  age: 23,
}
console.log(...obj); // TypeError: Found non-callable @@iterator

Símbolo.iterador

Si queremos que un objeto sea iterable, debemos agregarle al objeto un método Symbol.iteratorllamadoSymbol

  • Cuando se usa for ... ofun bucle para iterar sobre un objeto, Symbol.iteratorse llama a un método que debe devolver un iterador (un next()objeto con métodos).
  • Después de obtener el iterador, for ... ofllamará continuamente al next()método del iterador para obtener el siguiente elemento
  • next()El contenido devuelto por el método debe ajustarse al formato:, en ese momento{done:Boolean,value:any} , el ciclo finaliza, de lo contrario , es el siguiente valor.done:truevalue

iteradores:

El iterador se basa en C++el concepto de otros lenguajes. El principio del iterador es como un puntero. Apunta a un elemento en la recopilación de datos. Puede obtener el elemento al que apunta y también puede moverlo para obtener otros elementos. . Los iteradores son similares a la expansión de subíndices en matrices, y varias estructuras de datos, como listas enlazadas ( List), colecciones ( Set) y mapas ( Map), tienen iteradores correspondientes.

JSLos iteradores en están diseñados específicamente para atravesar esta operación. El iterador obtenido cada vez siempre apunta inicialmente al primer elemento, y el iterador tiene next()un solo comportamiento hasta que se obtiene el último elemento del conjunto de datos. No podemos mover de forma flexible la posición del iterador, por lo que la tarea del iterador es recorrer los elementos del conjunto de datos en un orden determinado.

Implementar un objeto iterable:

let obj = {
    name: 'Kite',
    age:23,
    [Symbol('id')]: 20000219
}
obj[Symbol.iterator] = function(){
    //返回一个迭代器
    return {
        index: 0,
        next: function () {
            const keys = Reflect.ownKeys(obj);
            if(this.index < keys.length - 1 ) {
                const key = keys[this.index];
                this.index++;
                return { done:false,value:obj[key] }
            } else {
                return { done:true, value: undefined }//迭代结束
            }
        }
    }
}
for(let value of obj){
    console.log(value)  // Kite 23 20000219
}
for(let key in obj){
  console.log(key)  // name age
}

El concepto de objetos iterables:

El llamado objeto iterable es un Symbol.iteratorobjeto ordinario con un método llamado método, que devuelve un iterador. Alternativamente, un objeto con Symbol.iteratorambos nextmétodos también es un objeto iterable.

 

Supongo que te gusta

Origin blog.csdn.net/qq_44376306/article/details/130781492
Recomendado
Clasificación