20 Maggio 2022
Expand search form

Cos’è un iterabile in JavaScript?

Gli iterabili sono una generalizzazione degli array. È un concetto che ci permette di rendere qualsiasi oggetto utilizzabile in un ciclo for..of.

Naturalmente, gli array sono iterabili. Ma ci sono molti altri oggetti incorporati che sono anch’essi iterabili. Per esempio, anche le stringhe sono iterabili.

Se un oggetto non è tecnicamente un array, ma rappresenta una collezione (lista, set) di qualcosa, allora for..of è un’ottima sintassi per fare un ciclo su di esso, quindi vediamo come farlo funzionare.

Simbolo.iteratore

Possiamo facilmente afferrare il concetto di iterabile creandone uno nostro.

Per esempio, abbiamo un oggetto che non è un array, ma sembra adatto a for..of .

Come un oggetto range che rappresenta un intervallo di numeri:

Per rendere l’oggetto range iterabile (e quindi far lavorare for..of) abbiamo bisogno di aggiungere un metodo all’oggetto chiamato Symbol.iterator (un simbolo speciale incorporato solo per questo).

  1. Quando for..of si avvia, chiama quel metodo una volta (o sbaglia se non viene trovato). Il metodo deve restituire un iteratore – un oggetto con il metodo next .
  2. In seguito, for..of lavora solo con quell’oggetto restituito.
  3. Quando for..of vuole il prossimo valore, chiama next() su quell’oggetto.
  4. Il risultato di next() deve avere la forma dove done=true significa che l’iterazione è finita, altrimenti value è il valore successivo.

Ecco l’implementazione completa per range con le osservazioni:

Notate la caratteristica principale degli iterabili: la separazione delle preoccupazioni.

  • L’intervallo stesso non ha il metodo next().
  • Invece, un altro oggetto, un cosiddetto “iteratore” viene creato dalla chiamata a range[Symbol.iterator]() , e il suo next() genera i valori per l’iterazione.

Quindi, l’oggetto iteratore è separato dall’oggetto su cui itera.

Tecnicamente, possiamo unirli e usare range stesso come iteratore per rendere il codice più semplice.

Ora range[Symbol.iterator]() restituisce l’oggetto range stesso: ha il necessario metodo next() e ricorda il progresso dell’iterazione corrente in this.current . Più breve? Sì. E a volte anche questo va bene.

Il lato negativo è che ora è impossibile avere due cicli for..of che girano sull’oggetto simultaneamente: condivideranno lo stato di iterazione, perché c’è solo un iteratore – l’oggetto stesso. Ma due for-of paralleli sono una cosa rara, anche in scenari asincroni.

Sono possibili anche iteratori infiniti. Per esempio, l’intervallo diventa infinito per range.to = Infinity . Oppure possiamo fare un oggetto iterabile che genera una sequenza infinita di numeri pseudorandom. Anche questo può essere utile.

Non ci sono limitazioni su next , può restituire sempre più valori, è normale.

Naturalmente, il ciclo for..of su tale iterabile sarebbe infinito. Ma possiamo sempre fermarlo usando break .

La stringa è iterabile

Array e stringhe sono gli iterabili incorporati più usati.

Per una stringa, for..of fa un loop sui suoi caratteri:

E funziona correttamente con le coppie surrogate!

Chiamare un iteratore esplicitamente

Per una comprensione più profonda, vediamo come usare un iteratore esplicitamente.

Itereremo su una stringa esattamente nello stesso modo di for..of , ma con chiamate dirette. Questo codice crea un iteratore di stringhe e ottiene valori da esso “manualmente”:

Questo è raramente necessario, ma ci dà più controllo sul processo rispetto a for..of . Per esempio, possiamo dividere il processo di iterazione: iterare un po’, poi fermarci, fare qualcos’altro, e poi riprendere più tardi.

Iterabili e array-like

Due termini ufficiali sembrano simili, ma sono molto diversi. Assicuratevi di capirli bene per evitare la confusione.

  • Iterables sono oggetti che implementano il metodo Symbol.iterator, come descritto sopra.
  • Array-likes sono oggetti che hanno indici e lunghezza, quindi assomigliano agli array.

Quando usiamo JavaScript per compiti pratici in un browser o in qualsiasi altro ambiente, possiamo incontrare oggetti che sono iterabili o simili ad array, o entrambi.

Per esempio, le stringhe sono sia iterabili (per..di funziona su di loro) che array-like (hanno indici numerici e lunghezza).

Ma un iterabile può non essere array-like. E viceversa un array-like può non essere iterabile.

Per esempio, l’intervallo nell’esempio sopra è iterabile, ma non array-like, perché non ha proprietà indicizzate e lunghezza .

Ed ecco l’oggetto che è array-like, ma non iterabile:

Sia gli iterabili che gli array-like sono di solito non sono arraynon hanno push, pop ecc. Questo è piuttosto scomodo se abbiamo un tale oggetto e vogliamo lavorare con esso come con un array. Per esempio, vorremmo lavorare con i range usando i metodi di array. Come ottenerlo?

Array.from

C’è un metodo universale Array.from che prende un iterabile o un valore simile ad un array e ne fa un “vero” Array. Poi possiamo chiamare metodi di array su di esso.

Array.from alla linea (*) prende l’oggetto, lo esamina per essere un iterabile o un array-like, poi fa un nuovo array e copia tutti gli elementi in esso.

Lo stesso accade per un iterabile:

La sintassi completa per Array.from ci permette anche di fornire una funzione opzionale di “mappatura”:

Il secondo argomento opzionale mapFn può essere una funzione che verrà applicata ad ogni elemento prima di aggiungerlo all’array, e thisArg ci permette di impostarla.

Qui usiamo Array.from per trasformare una stringa in un array di caratteri:

A differenza di str.split , si basa sulla natura iterabile della stringa e quindi, proprio come for..of , funziona correttamente con coppie surrogate.

Tecnicamente qui fa la stessa cosa di:

…ma è più breve.

Possiamo anche costruire slice surrogate-aware su di esso:

Riassunto

Gli oggetti che possono essere usati in for..of sono chiamati iterabili.

  • Tecnicamente, gli iterabili devono implementare il metodo chiamato Symbol.iterator .
    • Il risultato di obj[Symbol.iterator]() è chiamato un iteratore. Esso gestisce l’ulteriore processo di iterazione.
    • Un iteratore deve avere il metodo chiamato next() che restituisce un oggetto qui done:true denota la fine del processo di iterazione, altrimenti il valore è il valore successivo.

    Gli oggetti che hanno proprietà e lunghezza indicizzate sono chiamati array-like. Tali oggetti possono anche avere altre proprietà e metodi, ma non hanno i metodi integrati degli array.

    Se guardiamo all’interno della specifica – vedremo che la maggior parte dei metodi built-in assumono di lavorare con iterables o array-likes invece di “veri” array, perché questo è più astratto.

    Potreste anche essere interessati agli argomenti

    Cos’è l’iterabile e l’iteratore in JavaScript?

    Iterable : Un oggetto che ha proprietà enumerabili e può eseguire operazioni di iterazione. Tutti gli iterabili implementano un metodo Symbol. iterator , un simbolo speciale che esegue l’iterazione. Questo concetto ci permette di rendere gli oggetti utilizzabili in un ciclo for…of che normalmente non è possibile.Jan 21, 2018

    Continua…

    Come si fa a rendere iterabile in JavaScript?

    voci. Per rendere gli oggetti iterabili, dobbiamo prima capire come funziona l’iterazione in JavaScript. Quando una struttura dati iterabile, come un array, una stringa, un array di array e così via, vengono iterati con il ciclo for/of, viene invocato un metodo speciale all’interno della loro definizione, il metodo [Symbol. iterator]().Jan 4, 2021

    Continua…

    Cos’è un tipo Iterable?

    Iterable è uno pseudo-tipo introdotto in PHP 7.1. Accetta qualsiasi array o oggetto che implementa l’interfaccia Traversable. Entrambi questi tipi sono iterabili usando foreach e possono essere usati con yield dall’interno di un generatore.

    Continua…

    Qual è l’uso di Iterable?

    Appartiene a Java. In generale, un oggetto che implementa Iterable permette di essere iterato. Un’interfaccia iterabile permette ad un oggetto di essere l’obiettivo di un ciclo for avanzato (ciclo for-each).Dec 14, 2020

    Continua…

    Cos’è l’iterazione nella programmazione?

    Iterazione nella programmazione significa ripetere passi, o istruzioni, più e più volte. Questo è spesso chiamato ‘loop’. Gli algoritmi consistono in istruzioni che vengono eseguite una dopo l’altra.

    Continua…

    Cos’è una struttura dati iterabile?

    Un iterabile è una struttura dati che vuole rendere i suoi elementi accessibili al pubblico. Lo fa implementando un metodo la cui chiave è Symbol. iterator . Questo metodo è una fabbrica di iteratori.

    Continua…

    Cos’è l’iterabile nella collezione Java?

    L’interfaccia Java Iterable rappresenta una collezione di oggetti che è iterabile – cioè che può essere iterata. Questo significa che una classe che implementa l’interfaccia Java Iterable può avere i suoi elementi iterati.May 25, 2020

    Continua…

    Iterable è un’interfaccia funzionale?

    Iterable non è una FunctionalInterface quindi come può essere assegnato questo lambda? 25 gen 2017

    Continua…

    Qual è il significato di iterabile?

    Il nostro incontro con i cicli for ha introdotto il termine iterabile – un oggetto che può essere “iterato sopra”, come in un ciclo for. Definizione: Un iterabile è un qualsiasi oggetto Python capace di restituire i suoi membri uno alla volta, permettendogli di essere iterato in un ciclo for.

    Continua…

    Cos’è una stringa iterabile?

    Gli oggetti iterabili sono una generalizzazione degli array. È un concetto che ci permette di rendere qualsiasi oggetto utilizzabile in un ciclo for. Ma ci sono molti altri oggetti incorporati che sono anch’essi iterabili. … Per esempio, anche le stringhe sono iterabili.Dec 25, 2020

    Continua…

    Cos’è Iterable?

    Iterable è la piattaforma di marketing in crescita che consente ai marchi di creare, eseguire e ottimizzare campagne cross-channel con una flessibilità di dati senza precedenti. I marchi leader, come Zillow, SeatGeek e Box, scelgono. Iterable per alimentare il coinvolgimento dei clienti di classe mondiale durante l’intero ciclo di vita.

    Continua…

    Qual è la differenza tra iteratore e iterabile in Java?

    Iterator è un’interfaccia che ha un’implementazione per iterare gli elementi. Iterable è un’interfaccia che fornisce Iterator.Jul 29, 2011

    Continua…

    Cosa si intende per iterabile?

    Definizione: Un iterabile è un qualsiasi oggetto Python capace di restituire i suoi membri uno alla volta, permettendogli di essere iterato in un ciclo for. Esempi familiari di iterabili includono liste, tuple e stringhe – qualsiasi sequenza di questo tipo può essere iterata in un ciclo for.

    Continua…

    Una stringa JavaScript è iterabile?

    Continua…

    JavaScript map è un iterabile?

    La funzione Map() accetta un oggetto iterabile opzionale i cui elementi sono coppie chiave-valore.

    Continua…

    Quale metodo oggetto restituisce un iterabile in JavaScript?

    Per esempio, tutte le principali strutture dati ES6 (Arrays, Typed Arrays, Maps, Sets) hanno tre metodi che restituiscono oggetti iterabili:entries() restituisce un iterabile sulle voci codificate come Arrays [key, value]. … keys() restituisce un iterabile sulle chiavi delle voci.values() restituisce un iterabile sui valori delle voci.

    Continua…

Articolo precedente

Quanto è profondo un mobiletto per il bagno?

Articolo successivo

Quanto è comune la sindrome SMA?

You might be interested in …

Dove si attaccano l’ACL e il PCL?

Mnemonico: Incrociare le dita lunghe sull’indice e sovrapporre questa mano al ginocchio omolaterale. Questo ci aiuterà a ricordare l’orientamento del legamento crociato anteriore (ACL) e del legamento crociato posteriore (PCL) del ginocchio. Ricordate anche il […]