å復å¯è½ãª(iterables) ãªãã¸ã§ã¯ãã¯é
åã®æ±åã§ããããã¯ãfor..of ã«ã¼ãã§ä»»æã®ãªãã¸ã§ã¯ãã使ç¨ã§ããããã«ããããã®æ¦å¿µã§ãã
ãã¡ãããé åã¯å復å¯è½ã§ããããããä»ã«ãå¤ãã®çµã¿è¾¼ã¿ãªãã¸ã§ã¯ãããããããããåæ§ã«å復å¯è½ã§ããä¾ãã°ãæååãå復å¯è½ã§ããå¾ã§åããã¾ãããå¤ãã®çµã¿è¾¼ã¿ã®æ¼ç®åãã¡ã½ããã¯ãããã«ä¾åãã¦ãã¾ãã
ãããªãã¸ã§ã¯ããä½ãã®éå(ãªã¹ããã»ãã)ã表ãå ´åãfor..of ã¯ãããã«ã¼ãå¦çããã®ã«æé©ãªæ§æã§ããããã§ã¯ããããåä½ãããæ¹æ³ãè¦ã¦ã¿ã¾ãããã
Symbol.iterator
èªåèªèº«ã§å®éã«ä½ã£ã¦ã¿ãã¨ãå復å¯è½(iterables) ã®æ¦å¿µãç°¡åã«æ´ãäºãã§ãã¾ãã
ä¾ãã°ãé
åã§ã¯ããã¾ããããfor..of ã«é©ãããªãã¸ã§ã¯ããæã£ã¦ãã¾ãã
以ä¸ã¯æ°å¤ã®ééã表ã range ãªãã¸ã§ã¯ãã§ã:
let range = {
from: 1,
to: 5
};
// for..of ãåä½ããããã«ããã:
// for(let num of range) ... num=1,2,3,4,5
range ã å復å¯è½(iterable) ã«ããããã« (for..of ãåä½ãããããã«)ã¯ãSymbol.iterator (ãã®ããã®ç¹å¥ãªçµã¿è¾¼ã¿ã®ã·ã³ãã«ã§ã)ã¨ããååã®ã¡ã½ããããªãã¸ã§ã¯ãã«è¿½å ããå¿
è¦ãããã¾ãã
for..ofãå§ã¾ãã¨ããã®ã¡ã½ãããå¼ã³åºãã¾ã(ãªããã°ã¨ã©ã¼ã«ãªãã¾ã)ã- ã¡ã½ãã㯠iterator (ã¡ã½ãã
nextããã¤ãªãã¸ã§ã¯ã)ãè¿ããªããã°ããã¾ããã for..ofãæ¬¡ã®å¤ãå¿ è¦ã¨ããã¨ãããã®ãªãã¸ã§ã¯ãã®next()ãå¼ã³ã¾ããnext()ã®çµæã¯{done: Boolean, value: any}ã®å½¢å¼ã§ãªããã°ãªãã¾ãããããã¦done=trueã¯ç¹°ãè¿ããçµãã£ããã¨ã示ãã¾ããããã§ãªãå ´åã¯ãvalueã¯æ°ããå¤ã§ããå¿ è¦ãããã¾ãã
ãã㯠range ã®å®å
¨ãªå®è£
ã§ã:
let range = {
from: 1,
to: 5
};
// 1. for..of ã®å¼ã³åºãã¯ãæåã«ãããå¼ã³åºãã¾ã
range[Symbol.iterator] = function() {
// ...ãã㯠iterator ãªãã¸ã§ã¯ããè¿ãã¾ã:
// 2. 以éãfor..of ã¯ãã®ã¤ãã¬ã¼ã¿ã§ã®ã¿æ©è½ããæ¬¡ã®å¤ãè¦æ±ãã¾ã
return {
current: this.from,
last: this.to,
// 3. for..of ã«ã¼ãã«ãããåç¹°ãè¿ãã§ next() ãå¼ã°ãã¾ã
next() {
// 4. ãªãã¸ã§ã¯ã {done:.., value :...} ãè¿ãå¿
è¦ãããã¾ã
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
};
// ããã§åä½ãã¾ã!
for (let num of range) {
alert(num); // 1, 2, 3, 4, 5
}
å復å¯è½(iterables)ã®ä¸å¿çãªæ©è½ã«æ³¨ç®ãã¦ãã ãããé¢å¿ã®åé¢ã§ãã
rangeèªèº«ã¯next()ã¡ã½ãããæã£ã¦ãã¾ããã- 代ããã«ãå¥ã®ãªãã¸ã§ã¯ãããããã âã¤ãã¬ã¼ã¿â ã¯
range[Symbol.iterator]()ã®å¼ã³åºãã§çæãããå復ãå¦çãã¾ãã
å¾ã£ã¦ãå復ãªãã¸ã§ã¯ãã¯å復å¦çããããªãã¸ã§ã¯ãããåé¢ããã¦ãã¾ãã
æè¡çã«ã¯ãã³ã¼ããã·ã³ãã«ã«ããããã«ãããããã¼ã¸ãã¦ãrange èªèº«ã ã¤ãã¬ã¼ã¿ ã¨ãã¦ä½¿ããã¨ãã§ãã¾ãã
ãã®ããã«ãªãã¾ã:
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
alert(num); // 1, ãã㦠2, 3, 4, 5
}
ä»ãrange[Symbol.iterator]() 㯠range ãªãã¸ã§ã¯ãèªèº«ãè¿ãã¾ã: next() ã¡ã½ãããæã¡ãthis.current ã§ç¾å¨ã®å復ã®ç¶æ³ãè¦ãã¦ãã¾ãã
æ¬ ç¹ã¯ããªãã¸ã§ã¯ãã«å¯¾ãã¦åæã«2ã¤ã® for..of ã«ã¼ããå®è¡ãããã¨ã¯ä¸å¯è½ã ã¨ãããã¨ã§ãã: ã¤ãã¬ã¼ã¿ ã1ã¤ãããªãã®ã§ããªãã¸ã§ã¯ãã¯ç¹°ãè¿ãç¶æ
ãå
±æãã¾ããã§ããã2ã¤ã®ä¸¦å for-of ã¯ãã¨ãéåæã®ã·ããªãªã«ããã¦ãã¾ãã§ãã
ç¡éã® ã¤ãã¬ã¼ã¿ ãã¾ãå®è¡å¯è½ã§ããä¾ãã°ã range.to = Infinity ã§ãrange ãç¡é大ã«ãªãã¾ããã¾ãã¯ãæ¬ä¼¼ä¹±æ°ã®ç¡éã®ã·ã¼ã±ã³ã¹ãçæããå復å¯è½ãªãªãã¸ã§ã¯ããä½ããã¨ãã§ãã¾ãããããã¾ãå½¹ç«ã¤ãã¨ãããã¾ãã
next ã«ã¯å¶éã¯ãªããããå¤ãã®å¤ãè¿ããã¨ãã§ãã¾ãããããã¯æ£å¸¸ã§ãã
ãã¡ããããã®ãããªå復å¯è½ãªãªãã¸ã§ã¯ãã«å¯¾ãã for..of ã«ã¼ãã¯ã¨ã³ãã¬ã¹ã§ãããbreak ã使ã£ã¦ãã¤ã§ãæ¢ãããã¨ãã§ãã¾ãã
æååã¯å復å¯è½ã§ã
é åã¨æååã¯ãæãåºãçµã¿è¾¼ã¿ã® iterables ã§ä½¿ããã¦ãã¾ãã
æååã§ã¯ãfor..of ã¯ãã®æåãã«ã¼ããã¾ã:
for (let char of "test") {
// æåãã¨ã«1åãè¨4åå®è¡ãã¾ãã
alert( char ); // t, 次㫠e, 次㫠s, ãã㦠t
}
ããã¦ãµãã²ã¼ããã¢ãæ£ããåä½ãã¾ã!
let str = 'ð³ð';
for (let char of str) {
alert( char ); // ð³, ããã¦æ¬¡ã¯ ð
}
ã¤ãã¬ã¼ã¿ãæç¤ºçã«å¼ã³åºã
é常ãiterables ã®å
é¨ã¯å¤é¨ã®ã³ã¼ãããã¯é ãã¦ãã¾ããfor..of ã«ã¼ããããããããåä½ãã¾ããããã ããç¥ã£ã¦ããã°åé¡ããã¾ããã
ããããããå°ãæ·±ãçè§£ããããã«ãæç¤ºçãªã¤ãã¬ã¼ã¿ã®ä½ãæ¹ãè¦ã¦ã¿ã¾ãããã
for..of ã¨åãæ¹æ³ã§æååãå復å¦çãã¾ãããç´æ¥å¼ã³åºãããã¾ãããã®ã³ã¼ãã¯æååã®ã¤ãã¬ã¼ã¿ãåå¾ããããã âæåâ ã§å¼ã³åºãã¾ãã:
let str = "Hello";
// for (let char of str) alert(char);
// ã¨åããã¨ããã¦ãã¾ã
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
alert(result.value); // 1ã¤ãã¤æåãåºåãã¾ã
}
ããã¯ã»ã¨ãã©å¿
è¦ã¨ããã¾ããããfor..of ãããå¦çãããã³ã³ããã¼ã«ã§ãã¾ããä¾ãã°ãç¹°ãè¿ãå¦çãåå²ãããå ´å: å°ãå復ãã¦ãã忢ããå¥ã®ãã¨ããã¦ããå¾ã§åéãããããªå ´åã«å½¹ç«ã¡ã¾ãã
å復å¯è½(Iterables) 㨠é åã©ã¤ã¯(array-like)
åãããã«è¦ãã2ã¤ã®æ£å¼ãªç¨èªãããã¾ããã大ããç°ãªããã®ã§ãã æ··ä¹±ãé¿ããããã«ããããããçè§£ãã¦ãã ããã
- å復å¯è½(Iterables) ã¯ä¸ã§èª¬æããããã«ã
Symbol.iteratorã¡ã½ãããå®è£ ãããªãã¸ã§ã¯ãã§ãã - é
åã©ã¤ã¯(Array-likes) ã¯ãã¤ã³ããã¯ã¹ã¨
lengthãæã£ããªãã¸ã§ã¯ãã§ãããªã®ã§ããããã¯é åã®ããã«è¦ãã¾ãã
ãã©ã¦ã¶ãä»ã®ç°å¢ã§ãå®éã®ã¿ã¹ã¯ãå¦çããã®ã« JavaScript ã使ç¨ããã¨ããå復å¯è½ãããã¯é åã©ã¤ã¯ããããã¯ãã®ä¸¡æ¹ã®ãªãã¸ã§ã¯ãã«åºããããã¨ãããã¾ãã
ä¾ãã°ãæåå㯠å復å¯è½(iterable) (for..of ãåä½ãã) ã§ãããã㤠é
åã©ã¤ã¯(array-like) (æ°å¤ã¤ã³ããã¯ã¹ã¨ length ãæã£ã¦ãã¾ã) ã§ãã
ããããå復å¯è½(iterable) 㯠é åã©ã¤ã¯(array-like) ã§ãªãå¯è½æ§ãããã¾ããããã¦ãåãããã« é åã©ã¤ã¯(array-like) ã å復å¯è½(iterable) ã§ãªãå ´åãããã¾ãã
ä¾ãã°ãä¸ã®ä¾ã® range 㯠å復å¯è½(iterable) ã§ããã é
åã©ã¤ã¯(array-like) ã§ã¯ããã¾ããããªããªããã¤ã³ããã¯ã¹ã¨ length ãæã£ã¦ããªãããã§ãã
ããã¦ããã®ä¾ã¯ é åã©ã¤ã¯(array-like) ã§ããã å復å¯è½(iterable) ã§ã¯ãªããªãã¸ã§ã¯ãã§ã:
let arrayLike = { // ã¤ã³ããã¯ã¹ã¨lengthãæã£ã¦ãã => é
åã©ã¤ã¯
0: "Hello",
1: "World",
length: 2
};
// ã¨ã©ã¼ (Symbol.iterator ã¯ãªãã®ã§)
for (let item of arrayLike) {}
ãããã®å
±éç¹ã¯ãå復å¯è½(iterable) 㨠é
åã©ã¤ã¯(array-like) ã¯ä¸¡æ¹ã¨ãé常㮠é
åã§ã¯ãªããpush ã pop ãªã©ã®ã¡ã½ãããæã£ã¦ãã¾ãããããããã®ãããªãªãã¸ã§ã¯ããæã£ã¦ãã¦ãé
åã®ããã«å¦çãããå ´åã«ã¯ä¸ä¾¿ã§ãã
Array.from
ããããçµã³ã¤ããå
±éã®ã¡ã½ãã Array.from ãããã¾ãããã㯠å復å¯è½(iterable) ã¾ã㯠é
åã©ã¤ã¯(array-like) ãªå¤ã弿°ã«åãããããã âæ¬å½ã®â Array ãä½ãã¾ãããã以éãé
åã®ã¡ã½ãããå¼ã¹ãããã«ãªãã¾ãã
ä¾:
let arrayLike = {
0: "Hello",
1: "World",
length: 2
};
let arr = Array.from(arrayLike); // (*)
alert(arr.pop()); // World (ã¡ã½ãããåä½ãã¾ã)
è¡ (*) ã® Array.from ã¯ãªãã¸ã§ã¯ããåãåºããå復å¯è½(iterable) ã é
åã©ã¤ã¯(array-like) ãªã®ã調ã¹ãæ°ããé
åãä½ããã¹ã¦ã®ã¢ã¤ãã ãã³ãã¼ãã¾ãã
å復å¯è½(iterable) ã§ãåããã¨ãèµ·ããã¾ã:
// range ã¯ä¸è¿°ã®ä¾ã§å©ç¨ãããã®ã¨ä»®å®
let arr = Array.from(range);
alert(arr); // 1,2,3,4,5 (é
åã® toString å¤æãæ©è½ãã¾ã)
Array.from ã®å®å
¨ãªæ§æã§ã¯ããªãã·ã§ã³ã§ âãããã³ã°â 颿°ãæå®ã§ãã¾ã:
Array.from(obj[, mapFn, thisArg])
2ã¤ç®ã®å¼æ° mapFn ã¯ãé
åã«è¿½å ããåã«åè¦ç´ ã«é©ç¨ãã颿°ã§ãããthisArg ã¯ããã§ã® this ãæå®ã§ãã¾ãã
ä¾:
// range ã¯ä¸è¿°ã®ä¾ã§å©ç¨ãããã®ã¨ä»®å®
// åæ°å¤ã®å¹³æ¹
let arr = Array.from(range, num => num * num);
alert(arr); // 1,4,9,16,25
ããã§ãæååãæåé
åã«å¤æããããã« Array.from ã使ãã¾ã:
let str = 'ð³ð';
// str ãæåã®é
åã«åå²ãã¾ã
let chars = Array.from(str);
alert(chars[0]); // ð³
alert(chars[1]); // ð
alert(chars.length); // 2
str.split ã¨ã¯éããæåã®å復å¯è½ãªæ§è³ªã«ä¾åãããããfor..of ã®ããã«ãµãã²ã¼ããã¢ã§ãæ£ããåä½ãã¾ãã
æè¡çã«ã¯ãããã¯åããã¨ããã¦ãã¾ã:
let str = 'ð³ð';
let chars = []; // Array.from ã¯å
é¨ã§ã¯åãã«ã¼ãããã¾ã
for (let char of str) {
chars.push(char);
}
alert(chars);
â¦ããããçãæ¸ãã¾ãã
ãµãã²ã¼ããæèãã slice ãå®è£
ãããã¨ãã§ãã¾ã:
function slice(str, start, end) {
return Array.from(str).slice(start, end).join('');
}
let str = 'ð³ðð©·¶';
alert( slice(str, 1, 3) ); // ðð©·¶
// ãã¤ãã£ãã¡ã½ããã¯ãµãã²ã¼ããã¢ããµãã¼ããã¦ãã¾ãã
alert( str.slice(1, 3) ); // ã´ã (ç°ãªããµãã²ã¼ããã¢ã®çå²ãã§ã)
ãµããª
for..of ã使ãããªãã¸ã§ã¯ã㯠å復å¯è½(iterable) ã¨å¼ã°ãã¾ãã
- æè¡çã«ã¯ãå復å¯è½ã¯
Symbol.iteratorã¨å¼ã°ããã¡ã½ãããå®è£ ããªããã°ãªãã¾ãããobj[Symbol.iterator]ã®çµæã¯ ã¤ãã¬ã¼ã¿ ã¨å¼ã°ãã¾ããããã¯ããããªãå復å¦çãè¡ãã¾ãã- ã¤ãã¬ã¼ã¿ ã¯ãªãã¸ã§ã¯ã
{done: Boolean, value: any}ãè¿ãnext()ã¨å¼ã°ããã¡ã½ãããæã£ã¦ããªããã°ãªãã¾ãããããã§done:trueã¯ç¹°ãè¿ãã®çµãããæå³ããããã§ãªãã¨ãã¯ãvalueãæ¬¡ã®å¤ã«ãªãã¾ãã
Symbol.iteratorã¡ã½ããã¯for..ofã§èªåçã«å¼ã³åºããã¾ããããããç´æ¥å¼ã³åºããã¨ãã§ãã¾ãã- æååãé
åã®ãããªçµã¿è¾¼ã¿ã® iterables ãã¾ãã
Symbol.iteratorãå®è£ ãã¦ãã¾ãã - æååã® ã¤ãã¬ã¼ã¿ ã¯ãµãã²ã¼ããã¢ãèæ ®ã§ãã¾ãã
ã¤ã³ããã¯ã¹ä»ãã®ããããã£ã¨ length ããã¤ãªãã¸ã§ã¯ã㯠é
åã©ã¤ã¯(array-like) ã¨å¼ã°ãã¾ãããã®ãããªãªãã¸ã§ã¯ãã¯ä»ã®ããããã£ãã¡ã½ãããæã¤ãã¨ãã§ãã¾ãããé
åã®çµã¿è¾¼ã¿ã¡ã½ããã¯æã£ã¦ãã¾ããã
ããã仿§ã®å å´ãè¦ã¦ããã¨ãå¤ãã®çµã¿è¾¼ã¿ã¡ã½ããã¯ãâæ¬å½ã®â é åã®ä»£ããã« å復å¯è½(iterable) ã¾ã㯠é åã©ã¤ã¯(array-like) ã§åä½ãããã¨ãæ³å®ãã¦ãããã¨ããããã§ãããããªããªãããããã¯ããæ½è±¡çãªããã§ãã
Array.from(obj[, mapFn, thisArg]) 㯠å復å¯è½(iterable) ã¾ã㯠é
åã©ã¤ã¯(array-like) 㪠obj ã®å®éã® Array ã使ãããã®å¾é
åã®ã¡ã½ããã使ããããã«ãªãã¾ãããªãã·ã§ã³ã®å¼æ° mapFn 㨠thisArg ã¯ãåé
ç®ã«é¢æ°ãé©ç¨ãããã¨ãå¯è½ã«ãã¾ãã
ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã