(() => {
function from(iterable) {
return new IteratorWrapper(iterable);
}
function* map(iter, f) {
for (let x of iter) {
yield f(x);
}
}
function* filter(iter, f) {
for (let x of iter) {
if (f(x)) yield x;
}
}
function* take(iter, n) {
let i = 0;
for (let x of iter) {
if (i++ < n) yield x;
else break;
}
}
class IteratorWrapper {
constructor(iterable) {
this.iter = iterable[Symbol.iterator]();
}
[Symbol.iterator]() {
return this.iter;
}
map(f) {
return from(map(this.iter, f));
}
filter(f) {
return from(filter(this.iter, f));
}
take(n) {
return from(take(this.iter, n));
}
toArray() {
return [...this.iter];
}
}
// Voorbeeld gebruik:
const numbers = [1, 2, 3, 4, 5];
const result = from(numbers)
.map(x => x * 2)
.filter(x => x > 5)
.take(2)
.toArray();
console.log(result); // [6, 8]
})();
Example:
(() => {
function from(iterable) {
return new IteratorWrapper(iterable);
}
function* map(iter, f) {
for (let x of iter) {
yield f(x);
}
}
function* filter(iter, f) {
for (let x of iter) {
if (f(x)) yield x;
}
}
function* take(iter, n) {
let i = 0;
for (let x of iter) {
if (i++ < n) yield x;
else break;
}
}
class IteratorWrapper {
constructor(iterable) {
this.iter = iterable[Symbol.iterator]();
}
[Symbol.iterator]() {
return this.iter;
}
map(f) {
return from(map(this.iter, f));
}
filter(f) {
return from(filter(this.iter, f));
}
take(n) {
return from(take(this.iter, n));
}
first() {
return this.iter?.next()?.value || undefined;
}
toArray() {
return [...this.iter];
}
}
const dataStr = ["<div class=\"c-clients__contain\" id=\"jsClientsItemsHolder\">",
"<a href=\"https://www.2foqus.nl/\" target=\"_BLANK\" class=\"c-clients__item\">",
"<figure class=\"c-clients__figure\">",
"\t\t\t\t<img src=\"https://tans.net/storage/1194/conversions/2foqus-2019-Identity-Logo-CMYK-1.2-(002)-logo.png\" alt=\"2Foqus\" class=\"c-clients__img\">",
"\t\t</figure>",
"</a>",
"\t<a href=\"https://www.aartstoiletcabine.nl/\" target=\"_BLANK\" class=\"c-clients__item\">",
"<figure class=\"c-clients__figure\">",
"\t\t\t\t<img src=\"https://tans.net/storage/1163/conversions/Aarts-Sanitair-Service-logo.PNG\" alt=\"Aarts Sanitair Service\" class=\"c-clients__img\">",
"\t\t</figure>",
"</a>",
"\t<a href=\"https://www.abrex.nl/\" target=\"_BLANK\" class=\"c-clients__item\">",
"<figure class=\"c-clients__figure\">",
"\t\t\t\t<img src=\"https://tans.net/storage/1107/conversions/Logo-Abrex-logo.png\" alt=\"Abrex Logistics B.V.\" class=\"c-clients__img\">",
"\t\t</figure>",
"</a>",
"</div>\t"].join("\n");
const matches = (source, regex) => from(String(source || "").matchAll(regex));
const reLinks = /<a\s(.*?)>(.*?)<\/a>/gms;
const reHref = /href="(.*?)"/gms;
const reAlt = /<img\s.*?alt="(.*?)".*?>/gms;
const items = matches(dataStr, reLinks)
.map(x => {
const [_, attrs, content] = x;
return {
alt: matches(content, reAlt).first()[1],
href: matches(attrs, reHref).first()[1]
};
})
.take(2)
.toArray();
console.log(items);
})();(() => {
function createIteratorWrapper(iterable) {
const iter = iterable[Symbol.iterator](); // Haal de iterator op van het meegegeven iterable object
return {
[Symbol.iterator]() {
return iter;
},
map(f) {
return createIteratorWrapper(function* () {
for (let x of iter) {
yield f(x);
}
}());
},
filter(predicate) {
return createIteratorWrapper(function* () {
for (let x of iter) {
if (predicate(x)) yield x;
}
}());
},
take(n) {
return createIteratorWrapper(function* () {
let i = 0;
for (let x of iter) {
if (i++ < n) yield x;
else break;
}
}());
},
toArray() {
return [...iter];
}
};
}
// Voorbeeld gebruik:
const numbers = [1, 2, 3, 4, 5];
const iter = createIteratorWrapper(numbers);
const result = iter
.map(x => x * 2)
.filter(x => x > 5)
.take(2)
.toArray();
console.log(result); // [6, 8]
})();
885400cookie-checkJavascript IteratorWrapper