Iterable objekter er objekter, der kan itereres over med for..of
.
Teknisk set skal iterables implementere Symbol.iterator
metoden.
Du kan bruge en for..of
-løkke til at iterere over elementerne i en streng:
for (const x of "W3Schools") {
// code block to be executed
}
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Iterables</h2>
<p>Iterate over a String:</p>
<p id="demo"></p>
<script>
// Create a String
const name = "W3Schools";
// List all Elements
let text = ""
for (const x of name) {
text += x + "<br>";
}
document.getElementById("demo").innerHTML = text;
</script>
</body>
</html>
Du kan bruge en for..of
-løkke til at iterere over elementerne i et array:
for (const x of [1,2,3,4,5]) {
// code block to be executed
}
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Iterables</h2>
<p>Iterate over an Array:</p>
<p id="demo"></p>
<script>
// Create aa Array
const letters = ["a","b","c"];
// List all Elements
let text = "";
for (const x of letters) {
text += x + "<br>";
}
document.getElementById("demo").innerHTML = text;
</script>
</body>
</html>
iterator-protokollen definerer, hvordan man producerer en sekvens af værdier fra et objekt.
Et objekt bliver en iterator, når det implementerer en next()
metode.
Metoden next()
skal returnere et objekt med to egenskaber:
værdi (den næste værdi)
udført (sandt eller falsk)
Værdien returneret af iteratoren
(Kan udelades, hvis det er sandt)
sand hvis iteratoren er fuldført
false hvis iteratoren har produceret en ny værdi
Denne iterable returnerer uendelig: 10,20,30,40,... Hver gang next()
hedder:
// Home Made Iterable
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Create Iterable
const n = myNumbers();
n.next(); // Returns 10
n.next(); // Returns 20
n.next(); // Returns 30
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Iterables</h2>
<p>Home Made Iterable:</p>
<p id="demo"></p>
<script>
// Home Made Iterable
function myNumbers() {
let n = 0;
return {
next: function() {
n += 10;
return {value:n, done:false};
}
};
}
// Create Iterable
const n = myNumbers();
n.next(); // 10
n.next(); // 20
n.next(); // 30
document.getElementById("demo").innerHTML = n.next().value;
</script>
</body>
</html>
Problemet med en hjemmelavet iterabel:
Det understøtter ikke JavaScript-sætningen for..of
.
En JavaScript iterable er et objekt, der har en Symbol.iterator.
Symbol.iterator
er en funktion, der returnerer en next()
funktion.
En iterabel kan gentages med koden: for (const x of iterable) { }
// Create an Object
myNumbers = {};
// Make it Iterable
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
Nu kan du bruge for..of
for (const num of myNumbers) {
// Any Code Here
}
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Iterables</h2>
<p id="demo"></p>
<script>
// Create an Object
myNumbers = {};
// Make it Iterable
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
let text = ""
for (const num of myNumbers) {
text += num +"<br>"
}
document.getElementById("demo").innerHTML = text;
</script>
</body>
</html>
Symbol.iterator-metoden kaldes automatisk af for..of
. <p>Men vi kan også gøre det "manuelt"
let iterator = myNumbers[Symbol.iterator]();
while (true) {
const result = iterator.next();
if (result.done) break;
// Any Code Here
}
Prøv det selv →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Iterables</h2>
<p id="demo"></p>
<script>
// Create an Object
myNumbers = {};
// Make it Iterable
myNumbers[Symbol.iterator] = function() {
let n = 0;
done = false;
return {
next() {
n += 10;
if (n == 100) {done = true}
return {value:n, done:done};
}
};
}
// Create an Iterator
let iterator = myNumbers[Symbol.iterator]();
let text = ""
while (true) {
const result = iterator.next();
if (result.done) break;
text += result.value +"<br>";
}
document.getElementById("demo").innerHTML = text;
</script>
</body>
</html>