ãmapããã«ããŒé¢æ°ã§JavaScriptã€ãã¬ãŒã¿ã®èœåãæå€§éã«åŒãåºããŸããããããŒã¿ã¹ããªãŒã ã颿°åã§å¹ççã«å€æããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããæ¹æ³ãåŠã³ãŸãã
JavaScriptã€ãã¬ãŒã¿ãã«ããŒïŒé¢æ°åã€ãã¬ãŒã¿å€æã®ããã®map
çŸä»£ã®JavaScriptã®äžçã«ãããŠãã€ãã¬ãŒã¿ãšã€ãã©ãã«ã¯ããŒã¿ã®ã³ã¬ã¯ã·ã§ã³ãæ±ãããã®äžå¯æ¬ ãªããŒã«ã§ããmapãã«ããŒé¢æ°ã䜿çšãããšãã€ãã¬ãŒã¿ãçæããå€ã颿°åã§å€æã§ãã匷åã§å¹ççãªããŒã¿æäœãå¯èœã«ãªããŸãã
ã€ãã¬ãŒã¿ãšã€ãã©ãã«ã®çè§£
mapãã«ããŒã«ã€ããŠè©³ããèŠãåã«ãJavaScriptã«ãããã€ãã¬ãŒã¿ãšã€ãã©ãã«ã®åºæ¬æŠå¿µãç°¡åã«ããããããŸãããã
- ã€ãã©ãã« (Iterable):
for...ofæ§æãªã©ã§ã«ãŒããããå€ãå®çŸ©ãããªã©ãèªèº«ã®å埩åŠçã®æ¯ãèããå®çŸ©ãããªããžã§ã¯ããã€ãã©ãã«ã¯ãã€ãã¬ãŒã¿ãè¿ãåŒæ°ãªãã®é¢æ°ã§ãã@@iteratorã¡ãœãããå®è£ ããªããã°ãªããŸããã - ã€ãã¬ãŒã¿ (Iterator): ã·ãŒã±ã³ã¹ãå®çŸ©ããçµäºæã«è¿ãå€ãæã€å¯èœæ§ã®ãããªããžã§ã¯ããã€ãã¬ãŒã¿ã¯
next()ã¡ãœãããå®è£ ãããã®ã¡ãœããã¯2ã€ã®ããããã£ãæã€ãªããžã§ã¯ããè¿ããŸã:value(ã·ãŒã±ã³ã¹ã®æ¬¡ã®å€) ãšdone(ã·ãŒã±ã³ã¹ãçµäºãããã©ããã瀺ãçåœå€)ã
JavaScriptã«ãããã€ãã©ãã«ã®äžè¬çãªäŸã¯æ¬¡ã®ãšããã§ã:
- é
å (
[]) - æåå (
"hello") - ããã (
Map) - ã»ãã (
Set) - argumentsãªããžã§ã¯ã (颿°å ã§å©çšå¯èœ)
- åä»ãé
å (
Int8Array,Uint8Array, etc.) - ãŠãŒã¶ãŒå®çŸ©ã®ã€ãã©ãã« (
@@iteratorã¡ãœãããå®è£ ãããªããžã§ã¯ã)
颿°å倿ã®å
颿°åããã°ã©ãã³ã°ã¯ãäžå€æ§ïŒã€ãã¥ãŒã¿ããªãã£ïŒãšçŽç²é¢æ°ãéèŠããŸããããã«ãããããäºæž¬å¯èœã§ä¿å®æ§ã®é«ãã³ãŒããçãŸããŸããmapã€ãã¬ãŒã¿ãã«ããŒã䜿çšãããšãå
ã®ããŒã¿ãœãŒã¹ã倿Žãã*ããšãªã*ãã€ãã¬ãŒã¿ãçæããåå€ã«å€æé¢æ°ãé©çšã§ããŸããããã¯é¢æ°åããã°ã©ãã³ã°ã®éèŠãªååã§ãã
mapã€ãã¬ãŒã¿ãã«ããŒã®ç޹ä»
mapã€ãã¬ãŒã¿ãã«ããŒã¯ãç¹ã«ã€ãã¬ãŒã¿ãæ±ãããã«èšèšãããŠããŸããã€ãã¬ãŒã¿ãšå€æé¢æ°ãå
¥åãšããŠåãåããŸãããããŠã倿ãããå€ãçæãã*æ°ãã*ã€ãã¬ãŒã¿ãè¿ããŸããå
ã®ã€ãã¬ãŒã¿ã¯å€æŽãããŸããã
JavaScriptã®ãã¹ãŠã®ã€ãã¬ãŒã¿ãªããžã§ã¯ãã«çŽæ¥çµã¿èŸŒãŸããmapã¡ãœããã¯ãããŸããããLodashãUnderscore.jsãIxJSã®ãããªã©ã€ãã©ãªã¯ã€ãã¬ãŒã¿ã®ãããã³ã°æ©èœãæäŸããŠããŸããããã«ãç¬èªã®mapãã«ããŒé¢æ°ãç°¡åã«å®è£
ããããšãã§ããŸãã
ã«ã¹ã¿ã mapãã«ããŒã®å®è£
以äžã¯ãJavaScriptã«ãããmapãã«ããŒé¢æ°ã®ç°¡åãªå®è£
äŸã§ã:
function map(iterator, transform) {
return {
next() {
const result = iterator.next();
if (result.done) {
return { value: undefined, done: true };
}
return { value: transform(result.value), done: false };
},
[Symbol.iterator]() {
return this;
}
};
}
解説ïŒ
map颿°ã¯ãåŒæ°ãšããŠiteratorãštransform颿°ãåãåããŸãã- æ°ããã€ãã¬ãŒã¿ãªããžã§ã¯ããè¿ããŸãã
- æ°ããã€ãã¬ãŒã¿ã®
next()ã¡ãœããã¯ãå ã®ã€ãã¬ãŒã¿ã®next()ã¡ãœãããåŒã³åºããŸãã - å
ã®ã€ãã¬ãŒã¿ãçµäºããå Žåãæ°ããã€ãã¬ãŒã¿ã
{ value: undefined, done: true }ãè¿ããŸãã - ããã§ãªãå Žåã
transform颿°ãå ã®ã€ãã¬ãŒã¿ã®å€ã«é©çšããã倿ãããå€ãæ°ããã€ãã¬ãŒã¿ã§è¿ãããŸãã [Symbol.iterator]()ã¡ãœããã«ãããè¿ããããªããžã§ã¯ãèªèº«ãã€ãã©ãã«ã«ãªããŸãã
mapã®å®çšçãªäœ¿çšäŸ
mapã€ãã¬ãŒã¿ãã«ããŒã®äœ¿ãæ¹ã«ã€ããŠãããã€ãã®å®çšçãªäŸãèŠãŠãããŸãããã
äŸ1ïŒé åã®æ°å€ã2ä¹ãã
const numbers = [1, 2, 3, 4, 5];
const numberIterator = numbers[Symbol.iterator]();
const squaredNumbersIterator = map(numberIterator, (x) => x * x);
// ã€ãã¬ãŒã¿ãæ¶è²»ãã2ä¹ãããæ°å€ããã°ã«åºå
let result = squaredNumbersIterator.next();
while (!result.done) {
console.log(result.value); // åºå: 1, 4, 9, 16, 25
result = squaredNumbersIterator.next();
}
ãã®äŸã§ã¯ããŸãæ°å€ã®é
åããå§ããŸããnumbers[Symbol.iterator]()ã䜿çšããŠé
åããã€ãã¬ãŒã¿ãååŸããŸããæ¬¡ã«ãmapãã«ããŒã䜿ã£ãŠåæ°å€ã2ä¹ããå€ãçæããæ°ããã€ãã¬ãŒã¿ãäœæããŸããæåŸã«ãæ°ããã€ãã¬ãŒã¿ãå埩åŠçãã2ä¹ãããæ°å€ãã³ã³ãœãŒã«ã«åºåããŸãã
äŸ2ïŒæååã倧æåã«å€æãã
const names = ["alice", "bob", "charlie"];
const namesIterator = names[Symbol.iterator]();
const uppercaseNamesIterator = map(namesIterator, (name) => name.toUpperCase());
// ã€ãã¬ãŒã¿ãæ¶è²»ãã倧æåã®ååããã°ã«åºå
let nameResult = uppercaseNamesIterator.next();
while (!nameResult.done) {
console.log(nameResult.value); // åºå: ALICE, BOB, CHARLIE
nameResult = uppercaseNamesIterator.next();
}
ãã®äŸã¯ãmapã䜿çšããŠæååã®ã€ãã¬ãŒã¿ã倧æåã®æååã®ã€ãã¬ãŒã¿ã«å€æããæ¹æ³ã瀺ããŠããŸãã
äŸ3ïŒãžã§ãã¬ãŒã¿ãšã®é£æº
ãžã§ãã¬ãŒã¿ã¯ãJavaScriptã§ã€ãã¬ãŒã¿ãç°¡åã«äœæããããã®äŸ¿å©ãªæ¹æ³ãæäŸããŸãã
function* generateNumbers(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}
const numberGenerator = generateNumbers(10, 15);
const incrementedNumbersIterator = map(numberGenerator, (x) => x + 1);
// ã€ãã¬ãŒã¿ãæ¶è²»ããã€ã³ã¯ãªã¡ã³ããããæ°å€ããã°ã«åºå
let incrementedResult = incrementedNumbersIterator.next();
while (!incrementedResult.done) {
console.log(incrementedResult.value); // åºå: 11, 12, 13, 14, 15, 16
incrementedResult = incrementedNumbersIterator.next();
}
ããã§ã¯ãæ°å€ã®ã·ãŒã±ã³ã¹ãçæãããžã§ãã¬ãŒã¿é¢æ°generateNumbersãå®çŸ©ããŸããæ¬¡ã«ãmapã䜿çšããŠãåæ°å€ã«1ãå ããå€ãçæããæ°ããã€ãã¬ãŒã¿ãäœæããŸãã
äŸ4ïŒAPIããã®ããŒã¿åŠçïŒã·ãã¥ã¬ãŒã·ã§ã³ïŒ
firstNameãlastNameã®ãããªãã£ãŒã«ããæã€ãŠãŒã¶ãŒãªããžã§ã¯ããè¿ãAPIããããŒã¿ãååŸããå Žé¢ãæ³åããŠã¿ãŠãã ããããã«ããŒã ãçæããæ°ããã€ãã¬ãŒã¿ãäœæããããšæããããããŸããã
// APIããŒã¿ã®ã·ãã¥ã¬ãŒã·ã§ã³ïŒå®éã®APIåŒã³åºãã«çœ®ãæããŠãã ããïŒ
const users = [
{ id: 1, firstName: "Giovanni", lastName: "Rossi" },
{ id: 2, firstName: "Sakura", lastName: "Yamamoto" },
{ id: 3, firstName: "Kenzo", lastName: "Okonkwo" },
];
function* userGenerator(users) {
for (const user of users) {
yield user;
}
}
const userIterator = userGenerator(users);
const fullNamesIterator = map(userIterator, (user) => `${user.firstName} ${user.lastName}`);
// ã€ãã¬ãŒã¿ãæ¶è²»ãããã«ããŒã ããã°ã«åºå
let fullNameResult = fullNamesIterator.next();
while (!fullNameResult.done) {
console.log(fullNameResult.value); // åºå: Giovanni Rossi, Sakura Yamamoto, Kenzo Okonkwo
fullNameResult = fullNamesIterator.next();
}
ãã®äŸã¯ãmapã䜿çšããŠå€éšãœãŒã¹ããååŸããããŒã¿ãåŠçããæ¹æ³ã瀺ããŠããŸããç°¡åã«ããããã«APIã®å¿çã¯ã¢ãã¯ãããŠããŸããããã®ååã¯å®éã®APIãšã®ããåãã«ãé©çšãããŸãããã®äŸã§ã¯ãã°ããŒãã«ãªäœ¿çšç¶æ³ãåæ ããŠãæå³çã«å€æ§ãªååã䜿çšããŠããŸãã
mapã€ãã¬ãŒã¿ãã«ããŒã䜿çšããã¡ãªãã
- ã³ãŒãã®å¯èªæ§åäžïŒ
mapã¯ãã宣èšçãªããã°ã©ãã³ã°ã¹ã¿ã€ã«ãä¿é²ããã³ãŒãã®çè§£ãæšè«ã容æã«ããŸãã - ã³ãŒãã®ä¿å®æ§åäžïŒ
mapã«ãã颿°å倿ã¯ãããã¢ãžã¥ãŒã«åããããã¹ãããããã³ãŒãã«ã€ãªãããŸãã倿ããžãã¯ã®å€æŽã¯åé¢ãããŠãããå ã®ããŒã¿ãœãŒã¹ã«åœ±é¿ãäžããŸããã - å¹çæ§ã®åäžïŒ ã€ãã¬ãŒã¿ã䜿çšãããšãããŒã¿ã¹ããªãŒã ãé å»¶è©äŸ¡ã§åŠçã§ããŸããã€ãŸããå€ã¯å¿ èŠãªãšãã«ã®ã¿èšç®ãããŸããããã«ãããå€§èŠæš¡ãªããŒã¿ã»ãããæ±ãéã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããå¯èœæ§ããããŸãã
- 颿°åããã°ã©ãã³ã°ãã©ãã€ã ïŒ
mapã¯é¢æ°åããã°ã©ãã³ã°ã®ååã«æ²¿ã£ãŠãããäžå€æ§ãšçŽç²é¢æ°ã奚å±ããŸãã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
- ãšã©ãŒãã³ããªã³ã°ïŒ äºæããªãå
¥åå€ãé©åã«åŠçããããã«ã
transform颿°ã«ãšã©ãŒãã³ããªã³ã°ã远å ããããšãæ€èšããŠãã ããã - ããã©ãŒãã³ã¹ïŒ ã€ãã¬ãŒã¿ã¯é å»¶è©äŸ¡ãæäŸããŸãããè€éãªå€æé¢æ°ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã«æ³šæããŠãã ãããã³ãŒãããããã¡ã€ãªã³ã°ããŠãæœåšçãªããã«ããã¯ãç¹å®ããŸãããã
- 代æ¿ã©ã€ãã©ãªïŒ LodashãUnderscore.jsãIxJSãªã©ã®ã©ã€ãã©ãªã調ã¹ãŠãããé«åºŠãªãããã³ã°æ©èœãå«ããäºåã«æ§ç¯ãããã€ãã¬ãŒã¿ãŠãŒãã£ãªãã£ã掻çšããŸãããã
- ãã§ã€ãã³ã°ïŒé£éïŒïŒ ããè€éãªããŒã¿åŠçãã€ãã©ã€ã³ã§ã¯ãè€æ°ã®ã€ãã¬ãŒã¿ãã«ããŒãé£éãããããšïŒäŸïŒ
filterã®åŸã«mapïŒãæ€èšããŠãã ããã
ããŒã¿å€æã«ãããã°ããŒãã«ãªèæ ®äºé
倿§ãªãœãŒã¹ããã®ããŒã¿ãæ±ãéã«ã¯ãã°ããŒãã«ãªèŠç¹ãèæ ®ããããšãéèŠã§ãïŒ
- æ¥ä»ãšæå»ã®ãã©ãŒãããïŒ å€æããžãã¯ãäžçäžã§äœ¿çšãããŠããããŸããŸãªæ¥ä»ãšæå»ã®ãã©ãŒããããæ£ããåŠçã§ããããã«ããŠãã ãããå ç¢ãªæ¥ä»ã»æå»æäœã«ã¯ãMoment.jsãLuxonã®ãããªã©ã€ãã©ãªã䜿çšããŸãã
- é貚æç®ïŒ ããŒã¿ã«é貚䟡å€ãå«ãŸããå Žåã¯ãä¿¡é Œæ§ã®é«ãé貚æç®APIã䜿çšããŠãæ£ç¢ºãªå€æãä¿èšŒããŠãã ããã
- èšèªãšããŒã«ãªãŒãŒã·ã§ã³ïŒ ããã¹ãããŒã¿ã倿ããå Žåã¯ãããŸããŸãªèšèªãæåãšã³ã³ãŒãã£ã³ã°ã«æ³šæããŠãã ãããå€èšèªããµããŒãããããã«ãåœéåïŒi18nïŒã©ã€ãã©ãªã䜿çšããŸãã
- æ°å€ãã©ãŒãããïŒ å°åã«ãã£ãŠæ°å€ã®è¡šç€ºèŠåïŒäŸïŒå°æ°ç¹åºåãæåãæ¡åºåãæåïŒãç°ãªããŸãã倿ããžãã¯ããããã®å·®ç°ãæ£ããåŠçã§ããããã«ããŠãã ããã
çµè«
mapã€ãã¬ãŒã¿ãã«ããŒã¯ãJavaScriptã«ããã颿°åããŒã¿å€æã®ããã®åŒ·åãªããŒã«ã§ããã€ãã¬ãŒã¿ãçè§£ãã颿°åããã°ã©ãã³ã°ã®ååãåãå
¥ããããšã§ãããå¯èªæ§ãé«ããä¿å®ãããããå¹ççãªã³ãŒããæžãããšãã§ããŸãã倿§ãªãœãŒã¹ããã®ããŒã¿ãæ±ãéã«ã¯ãæ£ç¢ºã§æåçã«é
æ
®ããã倿ãä¿èšŒããããã«ãã°ããŒãã«ãªèŠç¹ãå¿ããªãã§ãã ãããæäŸãããäŸã詊ããJavaScriptã©ã€ãã©ãªã§å©çšå¯èœãªè±å¯ãªã€ãã¬ãŒã¿ãŠãŒãã£ãªãã£ãæ¢æ±ããŠãã€ãã¬ãŒã¿ããŒã¹ã®ããŒã¿åŠçã®å¯èœæ§ãæå€§éã«åŒãåºããŸãããã