JavaScriptã®éåæã€ãã¬ãŒã¿ãã«ããŒ'partition'ã解説ãè¿°èªé¢æ°ã«åºã¥ãéåæã¹ããªãŒã ãè€æ°ã«åå²ããå€§èŠæš¡ããŒã¿ã»ãããå¹ççã«éåæåŠçããæ¹æ³ãåŠã³ãŸãã
JavaScriptéåæã€ãã¬ãŒã¿ãã«ããŒ: Partition - å¹ççãªããŒã¿åŠçã®ããã®éåæã¹ããªãŒã åå²
çŸä»£ã®JavaScriptéçºã«ãããŠãç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããI/OããŠã³ããªæäœãæ±ãå Žåãéåæããã°ã©ãã³ã°ã¯éåžžã«éèŠã§ããéåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã¯ãéåæããŒã¿ã®ã¹ããªãŒã ãåŠçããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãã`partition`ãã«ããŒã¯ãéåæã€ãã¬ãŒã¿ã®ããŒã«ã®äžã§ãéåžžã«è²Žéãªãã®ã§ãããè¿°èªé¢æ°ã«åºã¥ããŠåäžã®éåæã¹ããªãŒã ãè€æ°ã®ã¹ããªãŒã ã«åå²ããããšãå¯èœã«ããŸããããã«ãããã¢ããªã±ãŒã·ã§ã³å ã§ããŒã¿èŠçŽ ãå¹ççãã€å¯Ÿè±¡ãçµã£ãŠåŠçã§ããŸãã
éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã®çè§£
`partition`ãã«ããŒã«ã€ããŠè©³ããèŠãŠããåã«ãéåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã«ã€ããŠç°¡åã«åŸ©ç¿ããŸããããéåæã€ãã¬ãŒã¿ã¯ãéåæã€ãã¬ãŒã¿ãããã³ã«ã«æºæ ãããªããžã§ã¯ãã§ããã€ãŸãã`value`ãš`done`ããããã£ãæã€ãªããžã§ã¯ãã«è§£æ±ºããããããã¹ãè¿ã`next()`ã¡ãœãããæã£ãŠããŸããéåæãžã§ãã¬ãŒã¿ã¯ãéåæã€ãã¬ãŒã¿ãè¿ã颿°ã§ããããã«ãããå€ããšã«ã€ãã³ãã«ãŒãã«å¶åŸ¡ãæ»ããªãããéåæã«å€ã®ã·ãŒã±ã³ã¹ãçæã§ããŸãã
äŸãã°ããªã¢ãŒãAPIããããŒã¿ããã£ã³ã¯åäœã§ååŸããéåæãžã§ãã¬ãŒã¿ãèããŠã¿ãŸããã:
async function* fetchData(url, chunkSize) {
let offset = 0;
while (true) {
const response = await fetch(`${url}?offset=${offset}&limit=${chunkSize}`);
const data = await response.json();
if (data.length === 0) {
return;
}
for (const item of data) {
yield item;
}
offset += chunkSize;
}
}
ãã®ãžã§ãã¬ãŒã¿ã¯ãæå®ããã`url`ãã`chunkSize`ã®ãã£ã³ã¯åäœã§ããŒã¿ãååŸããããŒã¿ããªããªããŸã§ç¶ããŸããå`yield`ã¯ãžã§ãã¬ãŒã¿ã®å®è¡ãäžæåæ¢ãããä»ã®éåææäœãé²è¡ã§ããããã«ããŸãã
`partition`ãã«ããŒã®ç޹ä»
`partition`ãã«ããŒã¯ãéåæã€ãã©ãã«ïŒäžèšã®éåæãžã§ãã¬ãŒã¿ãªã©ïŒãšè¿°èªé¢æ°ãå ¥åãšããŠåãåããŸãããããŠã2ã€ã®æ°ããéåæã€ãã©ãã«ãè¿ããŸããæåã®éåæã€ãã©ãã«ã¯ãå ã®ã¹ããªãŒã ããè¿°èªé¢æ°ãtruthyãªå€ãè¿ããã¹ãŠã®èŠçŽ ãyieldããŸãã2çªç®ã®éåæã€ãã©ãã«ã¯ãè¿°èªé¢æ°ãfalsyãªå€ãè¿ããã¹ãŠã®èŠçŽ ãyieldããŸãã
`partition`ãã«ããŒã¯å ã®éåæã€ãã©ãã«ã倿ŽããŸãããåã«ãããããéžæçã«æ¶è²»ãã2ã€ã®æ°ããã€ãã©ãã«ãäœæããã ãã§ãã
以äžã¯ã`partition`ã®åäœãç€ºãæŠå¿µçãªäŸã§ã:
async function* generateNumbers(count) {
for (let i = 0; i < count; i++) {
yield i;
}
}
async function main() {
const numbers = generateNumbers(10);
const [evenNumbers, oddNumbers] = partition(numbers, (n) => n % 2 === 0);
console.log("Even numbers:", await toArray(evenNumbers));
console.log("Odd numbers:", await toArray(oddNumbers));
}
// Helper function to collect async iterable into an array
async function toArray(asyncIterable) {
const result = [];
for await (const item of asyncIterable) {
result.push(item);
}
return result;
}
// Simplified partition implementation (for demonstration purposes)
async function partition(asyncIterable, predicate) {
const positive = [];
const negative = [];
for await (const item of asyncIterable) {
if (await predicate(item)) {
positive.push(item);
} else {
negative.push(item);
}
}
return [positive, negative];
}
main();
泚: æäŸãããŠãã`partition`ã®å®è£ ã¯å€§å¹ ã«ç°¡ç¥åãããŠããããã¹ãŠã®èŠçŽ ãè¿ãåã«é åã«ãããã¡ãªã³ã°ãããããæ¬çªç°å¢ã§ã®äœ¿çšã«ã¯é©ããŠããŸãããå®éã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãéåæãžã§ãã¬ãŒã¿ã䜿çšããŠããŒã¿ãã¹ããªãŒãã³ã°ããŸãã
ãã®ç°¡ç¥åãããããŒãžã§ã³ã¯ãæŠå¿µãæç¢ºã«ããããã®ãã®ã§ããå®éã®å®è£ ã§ã¯ã2ã€ã®éåæã€ãã¬ãŒã¿ãã¹ããªãŒã ãšããŠçæãããã¹ãŠã®ããŒã¿ãäºåã«ã¡ã¢ãªã«ããŒãããªãããã«ããå¿ èŠããããŸãã
ããçŸå®çãª`partition`ã®å®è£ ïŒã¹ããªãŒãã³ã°ïŒ
以äžã¯ããã¹ãŠã®ããŒã¿ãã¡ã¢ãªã«ãããã¡ãªã³ã°ããããšãé¿ããå¹ççãªã¹ããªãŒãã³ã°ãå¯èœã«ããããã«éåæãžã§ãã¬ãŒã¿ã掻çšãããããå ç¢ãª`partition`ã®å®è£ ã§ã:
async function partition(asyncIterable, predicate) {
async function* positiveStream() {
for await (const item of asyncIterable) {
if (await predicate(item)) {
yield item;
}
}
}
async function* negativeStream() {
for await (const item of asyncIterable) {
if (!(await predicate(item))) {
yield item;
}
}
}
return [positiveStream(), negativeStream()];
}
ãã®å®è£ ã¯ã`positiveStream`ãš`negativeStream`ãšãã2ã€ã®éåæãžã§ãã¬ãŒã¿é¢æ°ãäœæããŸããåãžã§ãã¬ãŒã¿ã¯å ã®`asyncIterable`ãå埩åŠçãã`predicate`颿°ã®çµæã«åºã¥ããŠèŠçŽ ãyieldããŸããããã«ãããããŒã¿ããªã³ããã³ãã§åŠçãããããšãä¿èšŒãããã¡ã¢ãªã®éè² è·ãé²ããå¹ççãªããŒã¿ã¹ããªãŒãã³ã°ãå¯èœã«ãªããŸãã
`partition`ã®ãŠãŒã¹ã±ãŒã¹
`partition`ãã«ããŒã¯å€æ©èœã§ãããæ§ã ãªã·ããªãªã§å¿çšã§ããŸãã以äžã«ããã€ãã®äŸãæããŸã:
1. åãããããã£ã«åºã¥ãããŒã¿ãã£ã«ã¿ãªã³ã°
ç°ãªãã¿ã€ãã®ã€ãã³ãïŒäŸïŒãŠãŒã¶ãŒãã°ã€ã³ã泚æããšã©ãŒãã°ïŒã衚ãJSONãªããžã§ã¯ãã®éåæã¹ããªãŒã ããããšããŸãã`partition`ã䜿çšããŠããããã®ã€ãã³ãã察象ãçµã£ãåŠçã®ããã«ç°ãªãã¹ããªãŒã ã«åå²ã§ããŸã:
async function* generateEvents() {
yield { type: "user_login", userId: 123, timestamp: Date.now() };
yield { type: "order_placed", orderId: 456, amount: 100 };
yield { type: "error_log", message: "Failed to connect to database", timestamp: Date.now() };
yield { type: "user_login", userId: 789, timestamp: Date.now() };
}
async function main() {
const events = generateEvents();
const [userLogins, otherEvents] = partition(events, (event) => event.type === "user_login");
console.log("User logins:", await toArray(userLogins));
console.log("Other events:", await toArray(otherEvents));
}
2. ã¡ãã»ãŒãžãã¥ãŒã§ã®ã¡ãã»ãŒãžã«ãŒãã£ã³ã°
ã¡ãã»ãŒãžãã¥ãŒã·ã¹ãã ã§ã¯ãã¡ãã»ãŒãžã®å 容ã«åºã¥ããŠç°ãªãã³ã³ã·ã¥ãŒãã«ã«ãŒãã£ã³ã°ãããå ŽåããããŸãã`partition`ãã«ããŒã䜿çšãããšãåä¿¡ã¡ãã»ãŒãžã¹ããªãŒã ãè€æ°ã®ã¹ããªãŒã ã«åå²ãããããããç¹å®ã®ã³ã³ã·ã¥ãŒãã°ã«ãŒãã«å®ãŠãããšãã§ããŸããäŸãã°ãéèååŒã«é¢é£ããã¡ãã»ãŒãžã¯éèåŠçãµãŒãã¹ã«ããŠãŒã¶ãŒã¢ã¯ãã£ããã£ã«é¢é£ããã¡ãã»ãŒãžã¯åæãµãŒãã¹ã«ã«ãŒãã£ã³ã°ã§ããŸãã
3. ããŒã¿æ€èšŒãšãšã©ãŒåŠç
ããŒã¿ã¹ããªãŒã ãåŠçããéã`partition`ã䜿çšããŠæå¹ãªã¬ã³ãŒããšç¡å¹ãªã¬ã³ãŒããåé¢ã§ããŸããç¡å¹ãªã¬ã³ãŒãã¯ããšã©ãŒãã®ã³ã°ãä¿®æ£ããŸãã¯æåŠã®ããã«å¥éåŠçããããšãã§ããŸãã
async function* generateData() {
yield { id: 1, name: "Alice", age: 30 };
yield { id: 2, name: "Bob", age: -5 }; // Invalid age
yield { id: 3, name: "Charlie", age: 25 };
}
async function main() {
const data = generateData();
const [validRecords, invalidRecords] = partition(data, (record) => record.age >= 0);
console.log("Valid records:", await toArray(validRecords));
console.log("Invalid records:", await toArray(invalidRecords));
}
4. åœéåïŒi18nïŒãšå°ååïŒl10nïŒ
è€æ°ã®èšèªã§ã³ã³ãã³ããé ä¿¡ããã·ã¹ãã ããããšæ³åããŠãã ããã`partition`ã䜿çšãããšãç°ãªãå°åããŠãŒã¶ãŒã°ã«ãŒãåãã«æå³ãããèšèªã«åºã¥ããŠã³ã³ãã³ãããã£ã«ã¿ãªã³ã°ã§ããŸããäŸãã°ãèšäºã®ã¹ããªãŒã ãåå²ããŠãåç±³ãè±åœåãã®è±èªèšäºãšãã©ãã³ã¢ã¡ãªã«ãã¹ãã€ã³åãã®ã¹ãã€ã³èªèšäºãåããããšãã§ããŸããããã«ãããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«å¯ŸããŠãããããŒãœãã©ã€ãºãããé¢é£æ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãä¿é²ããŸãã
äŸ: ã«ã¹ã¿ããŒãµããŒãã®ãã±ãããèšèªå¥ã«åããé©åãªãµããŒãããŒã ã«ã«ãŒãã£ã³ã°ããã
5. äžæ£æ€åº
éèã¢ããªã±ãŒã·ã§ã³ã§ã¯ãååŒã®ã¹ããªãŒã ãåå²ããŠãç¹å®ã®åºæºïŒäŸïŒç°åžžã«é«é¡ãªååŒãçãããå Žæããã®ååŒïŒã«åºã¥ããŠæœåšçã«äžæ£ãªæŽ»åãåé¢ã§ããŸããç¹å®ãããååŒã¯ãäžæ£æ€åºã¢ããªã¹ãã«ãããããªã調æ»ã®ããã«ãã©ã°ãç«ãŠãããšãã§ããŸãã
`partition`ã䜿çšããã¡ãªãã
- ã³ãŒãæ§æã®æ¹å: `partition`ã¯ãããŒã¿åŠçããžãã¯ãå¥ã ã®ã¹ããªãŒã ã«åé¢ããããšã§ã¢ãžã¥ãŒã«æ§ãä¿é²ããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããŸãã
- ããã©ãŒãã³ã¹ã®åäž: åã¹ããªãŒã ã§é¢é£ããããŒã¿ã®ã¿ãåŠçããããšã§ãããã©ãŒãã³ã¹ãæé©åãããªãœãŒã¹æ¶è²»ãåæžã§ããŸãã
- æè»æ§ã®åäž: `partition`ã䜿çšãããšãå€åããèŠä»¶ã«ããŒã¿åŠçãã€ãã©ã€ã³ãç°¡åã«é©å¿ãããããšãã§ããŸãã
- éåæåŠç: éåæããã°ã©ãã³ã°ã¢ãã«ãšã·ãŒã ã¬ã¹ã«çµ±åããå€§èŠæš¡ãªããŒã¿ã»ãããI/OããŠã³ããªæäœãå¹ççã«åŠçã§ããŸãã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
- è¿°èªé¢æ°ã®ããã©ãŒãã³ã¹: è¿°èªé¢æ°ã¯ã¹ããªãŒã å ã®åèŠçŽ ã«å¯ŸããŠå®è¡ããããããå¹ççã§ããããšã確èªããŠãã ãããè¿°èªé¢æ°å ã§ã®è€éãªèšç®ãI/Oæäœã¯é¿ããŠãã ããã
- ãªãœãŒã¹ç®¡ç: å€§èŠæš¡ãªã¹ããªãŒã ãæ±ãéã¯ããªãœãŒã¹æ¶è²»ã«æ³šæããŠãã ãããã¡ã¢ãªã®éè² è·ãé²ãããã«ãããã¯ãã¬ãã·ã£ãŒãªã©ã®æè¡ã®äœ¿çšãæ€èšããŠãã ããã
- ãšã©ãŒåŠç: ã¹ããªãŒã åŠçäžã«çºçããå¯èœæ§ã®ããäŸå€ãé©åã«åŠçããããã«ãå ç¢ãªãšã©ãŒåŠçã¡ã«ããºã ãå®è£ ããŠãã ããã
- ãã£ã³ã»ã«åŠç: ã¹ããªãŒã ã®ã¢ã€ãã ãäžèŠã«ãªã£ããšãã«æ¶è²»ã忢ããããã®ãã£ã³ã»ã«ã¡ã«ããºã ãå®è£ ããŠãã ãããããã¯ãç¹ã«ç¡éã¹ããªãŒã ã®å Žåã«ã¡ã¢ãªããªãœãŒã¹ãè§£æŸããããã«éåžžã«éèŠã§ãã
ã°ããŒãã«ãªèŠç¹: 倿§ãªããŒã¿ã»ãããžã®`partition`ã®é©å¿
äžçäžã®ããŒã¿ãæ±ãéã«ã¯ãæåçããã³å°åçãªéããèæ ®ããããšãéèŠã§ãã`partition`ãã«ããŒã¯ãè¿°èªé¢æ°å ã«ãã±ãŒã«ãæèããæ¯èŒã倿ãçµã¿èŸŒãããšã§ã倿§ãªããŒã¿ã»ããã«å¯Ÿå¿ãããããšãã§ããŸããäŸãã°ãé貚ã«åºã¥ããŠããŒã¿ããã£ã«ã¿ãªã³ã°ããå Žåãçºæ¿ã¬ãŒããå°åã®æžåŒèŠåãèæ ®ããé貚察å¿ã®æ¯èŒé¢æ°ã䜿çšãã¹ãã§ããããã¹ãããŒã¿ãåŠçããå Žåãè¿°èªã¯ç°ãªãæåãšã³ã³ãŒãã£ã³ã°ãèšèªèŠåãåŠçããå¿ èŠããããŸãã
äŸ: 顧客ããŒã¿ãå°åã«åºã¥ããŠåå²ããç¹å®ã®å°åã«åãããç°ãªãããŒã±ãã£ã³ã°æŠç¥ãé©çšãããããã«ã¯ãå°çäœçœ®æ å ±ã©ã€ãã©ãªã䜿çšããå°åã®ããŒã±ãã£ã³ã°ã«é¢ããæŽå¯ãè¿°èªé¢æ°ã«çµã¿èŸŒãå¿ èŠããããŸãã
é¿ããã¹ãäžè¬çãªééã
- `done`ã·ã°ãã«ãæ£ããåŠçããªã: äºæããªãåäœããšã©ãŒãé²ãããã«ãéåæã€ãã¬ãŒã¿ããã®`done`ã·ã°ãã«ãã³ãŒããé©åã«åŠçããããã«ããŠãã ããã
- è¿°èªé¢æ°ã§ã€ãã³ãã«ãŒãããããã¯ãã: è¿°èªé¢æ°å ã§åæçãªæäœãæéã®ãããã¿ã¹ã¯ãå®è¡ããããšã¯é¿ããŠãã ãããããã¯ã€ãã³ãã«ãŒãããããã¯ããããã©ãŒãã³ã¹ãäœäžãããå¯èœæ§ããããŸãã
- éåææäœã«ãããæœåšçãªãšã©ãŒãç¡èŠãã: ãããã¯ãŒã¯ãªã¯ãšã¹ãããã¡ã€ã«ã·ã¹ãã ã¢ã¯ã»ã¹ãªã©ãéåææäœäžã«çºçããå¯èœæ§ã®ããæœåšçãªãšã©ãŒã¯åžžã«åŠçããŠãã ããã`try...catch`ãããã¯ããããã¹ã®ãªãžã§ã¯ã·ã§ã³ãã³ãã©ã䜿çšããŠããšã©ãŒãé©åã«ãã£ããããŠåŠçããŸãã
- ç°¡ç¥åçã®partitionãæ¬çªç°å¢ã§äœ¿çšãã: å ã«åŒ·èª¿ããããã«ãç°¡ç¥åãããäŸã®ããã«ã¢ã€ãã ãçŽæ¥ãããã¡ãªã³ã°ããããšã¯é¿ããŠãã ããã
`partition`ã®ä»£æ¿ææ®µ
`partition`ã¯åŒ·åãªããŒã«ã§ãããéåæã¹ããªãŒã ãåå²ããããã®ä»£æ¿ã¢ãããŒããååšããŸã:
- è€æ°ã®ãã£ã«ã¿ãŒã䜿çšãã: å ã®ã¹ããªãŒã ã«è€æ°ã®`filter`æäœãé©çšããããšã§ãåæ§ã®çµæãåŸãããšãã§ããŸãããããããã®ã¢ãããŒãã¯ã¹ããªãŒã ãè€æ°åå埩åŠçããå¿ èŠãããããã`partition`ãããå¹çãæªãå ŽåããããŸãã
- ã«ã¹ã¿ã ã¹ããªãŒã 倿: ç¹å®ã®åºæºã«åºã¥ããŠã¹ããªãŒã ãè€æ°ã®ã¹ããªãŒã ã«åå²ããã«ã¹ã¿ã ã¹ããªãŒã 倿ãäœæã§ããŸãããã®ã¢ãããŒãã¯æãæè»æ§ããããŸãããå®è£ ã«ã¯ããå€ãã®åŽåãå¿ èŠã§ãã
çµè«
JavaScriptã®éåæã€ãã¬ãŒã¿ãã«ããŒã§ãã`partition`ã¯ãè¿°èªé¢æ°ã«åºã¥ããŠéåæã¹ããªãŒã ãå¹ççã«è€æ°ã®ã¹ããªãŒã ã«åå²ããããã®è²ŽéãªããŒã«ã§ããããã¯ã³ãŒãã®æ§æãä¿é²ããããã©ãŒãã³ã¹ãåäžãããæè»æ§ãé«ããŸãããã®å©ç¹ãèæ ®äºé ããŠãŒã¹ã±ãŒã¹ãçè§£ããããšã§ã`partition`ã广çã«æŽ»çšããŠãå ç¢ã§ã¹ã±ãŒã©ãã«ãªããŒã¿åŠçãã€ãã©ã€ã³ãæ§ç¯ã§ããŸããã°ããŒãã«ãªèŠç¹ãèæ ®ãã倿§ãªããŒã¿ã»ããã广çã«åŠçããããã«å®è£ ãé©å¿ãããäžçäžã®ãªãŒãã£ãšã³ã¹ã«ã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããŠãã ãããçã®ã¹ããªãŒãã³ã°çã®`partition`ãå®è£ ãããã¹ãŠã®èŠçŽ ãäºåã«ãããã¡ãªã³ã°ããªãããã«æ³šæããŠãã ããã