Array.prototype.reduceRight()
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
reduceRight() 㯠Array ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ããã§ãã¢ãã¥ã¼ã ã¬ã¼ã¿ã¼ã¨é
åã®ããããã®å¤ã«å¯¾ãã¦ï¼å³ããå·¦ã¸ï¼é¢æ°ãé©ç¨ãã¦ãåä¸ã®å¤ã«ãã¾ãã
å·¦ããå³ã¸é©ç¨ããå ´å㯠Array.prototype.reduce() ãåç
§ãã¦ãã ããã
試ãã¦ã¿ã¾ããã
const array = [
[0, 1],
[2, 3],
[4, 5],
];
const result = array.reduceRight((accumulator, currentValue) =>
accumulator.concat(currentValue),
);
console.log(result);
// äºæ³ãããçµæ: Array [4, 5, 2, 3, 0, 1]
æ§æ
reduceRight(callbackFn)
reduceRight(callbackFn, initialValue)
弿°
callbackFn-
é åã®åè¦ç´ ã«å¯¾ãã¦å®è¡ããã颿°ã§ãããã®è¿å¤ã¯ã次ã«
callbackFnãå¼ã³åºãéã®accumulator弿°ã®å¤ã«ãªãã¾ããæå¾ã®å¼ã³åºãã§ã¯ãè¿å¤ã¯reduceRight()ã®è¿å¤ã¨ãªãã¾ãããã®é¢æ°ã¯ä»¥ä¸ã®å¼æ°ã§å¼ã³åºããã¾ããaccumulator-
ååã®
callbackFnã®å¼ã³åºãçµæã®å¤ã§ããååã®å¼ã³åºãã§ã¯initialValueãæå®ããã¦ããå ´åã¯ãã®å¤ãããã§ãªãå ´åã¯ãã®é åã®æ«å°¾ã®è¦ç´ ã®å¤ã§ãã currentValue-
ç¾å¨ã®è¦ç´ ã®å¤ã§ããååã®å¼ã³åºãã§ã¯
initialValueãæå®ãããå ´åã¯æ«å°¾ã®è¦ç´ ã®å¤ã§ãããããã§ãªãå ´åã¯æ«å°¾ãã 2 çªç®ã®è¦ç´ ã®å¤ã§ãã currentIndex-
currentValueã®ã¤ã³ããã¯ã¹ä½ç½®ã§ããååã®å¼ã³åºãã§ã¯ãinitialValueãæå®ãããå ´åã¯array.length - 1ãããã§ãªãå ´åã¯array.length - 2ã§ãã -
reduceRight()ãå¼ã³åºãããé åã§ãã
initialValueçç¥å¯-
callbackFnã®æåã®å¼ã³åºãã®ã¨ãã«ãã¢ãã¥ã¼ã ã¬ã¼ã¿ã¼ã¨ãã¦ä½¿ç¨ããå¤ã§ããåæå¤ã渡ãããªãã£ãå ´åã¯ãé åã®æå¾ã®è¦ç´ ãé©ç¨ããããã®è¦ç´ ãé£ã°ããã¾ããã¾ããreduceRight()ã空ã®é åã«å¯¾ãã¦åæå¤ãªãã§å¼ã³åºãã¨TypeErrorã«ãªãã¾ãã
è¿å¤
ç³ã¿è¾¼ã¿ã«ãã£ã¦å¾ãããå¤ã§ãã
解説
reduceRight() ã¡ã½ããã¯å復å¦çã¡ã½ããã§ããã縮å°ãã³ã¼ã«ããã¯é¢æ°ãé
åã«å«ã¾ããåè¦ç´ ã«å¯¾ãã¦æé ã«ä¸åº¦ãã¤å¼ã³åºãããã®çµæãåä¸ã®å¤ã«ç©ç®ãã¾ãããããã®ã¡ã½ãããä¸è¬çã«ã©ã®ããã«åä½ããã®ãã«ã¤ãã¦ã®è©³ç´°ã¯ãå復å¦çã¡ã½ããã®ç¯ãã覧ä¸ããã
callbackFn ã¯å¤ãå²ãå½ã¦ããã¦ããé
åã¤ã³ããã¯ã¹ã«å¯¾ãã¦ã®ã¿å¼ã³åºããã¾ããçé
åã®ç©ºã®ã¹ãããã«å¯¾ãã¦ã¯å¼ã³åºããã¾ããã
ä»ã®å復å¦çã¡ã½ããã¨ã¯ç°ãªãã reduceRight() 㯠thisArg 弿°ãåãå
¥ãã¾ããã callbackFn ã¯å¸¸ã« undefined ã this ã¨ãã¦å¼ã³åºããã callbackFn ã峿 ¼ã¢ã¼ãã§ãªãå ´å㯠globalThis ã«ç½®ãæãããã¾ãã
reduceRight() ã¡ã½ããã¯æ±ç¨çã§ãããã㯠this å¤ã« length ããããã£ã¨æ´æ°ãã¼ã®ããããã£ããããã¨ã ããæå¾
ãã¾ãã
reduce() ã使ç¨ãã¹ãã§ãªãå ´åã§èª¬æããã¦ãã reduce ã«é¢ãããã¹ã¦ã®æ³¨æç¹ã¯ãreduceRight ã«ãå½ã¦ã¯ã¾ãã¾ããJavaScript ã«ã¯é
å»¶è©ä¾¡ã®æå³ã¥ãããªããããreduce 㨠reduceRight ã®éã«ããã©ã¼ãã³ã¹ã®éãã¯ããã¾ããã
ä¾
>åæå¤ããªãå ´åã® reduceRight() ã®åä½
reduceRight ã® callbackFn ã®å¼ã³åºãã¯æ¬¡ã®ããã«ãªãã¾ãï¼
arr.reduceRight((accumulator, currentValue, index, array) => {
// â¦
});
颿°ãåãã¦å¼ã³åºãããã¨ããaccumulator 㨠currentValue ã¯ã2 ã¤ã®å¤ã®ããããã«ãªãã¾ãã initialValue ãæå®ã㦠reduceRight ãå¼ã³åºããå ´åãaccumulator 㯠initialValue ã¨çãããªããcurrentValue ã¯é
åã®æå¾ã®å¤ã¨çãããªãã¾ããinitialValue ãæå®ãããªãã£ãå ´åãaccumulator ã¯é
åã®æå¾ã®å¤ã«çãããcurrentValue ã¯æå¾ãã 2 çªç®ã®å¤ã«çãããªãã¾ãã
é
åã空ã§ãinitialValue ãæå®ãããªãã£ãå ´åã¯ãTypeError ãçºçãã¾ããé
åã« (ä½ç½®ã«é¢ããã) è¦ç´ ã 1 ã¤ãããªããinitialValue ãæå®ãããªãã£ãå ´åãã¾ã㯠initialValue ãæå®ããããé
åã空ã ã£ãå ´åã¯ãcallbackFn ãå¼ã³åºãããã«åç¬ã®å¤ãè¿ããã¾ãã
ãã®é¢æ°ã使ç¨ããå ´åã«ã¤ãã¦è¦ã¦ã¿ã¾ãããã
[0, 1, 2, 3, 4].reduceRight(
(accumulator, currentValue, index, array) => accumulator + currentValue,
);
ã³ã¼ã«ããã¯ã¯ 4 åå¼ã³åºãããããããã®å¼ã³åºãã®å¼æ°ã¨è¿å¤ã¯æ¬¡ã®ããã«ãªãã¾ãã
accumulator |
currentValue |
index |
Return value | |
|---|---|---|---|---|
| First call | 4 |
3 |
3 |
7 |
| Second call | 7 |
2 |
2 |
9 |
| Third call | 9 |
1 |
1 |
10 |
| Fourth call | 10 |
0 |
0 |
10 |
reduceRight ã®è¿å¤ã¯ãã³ã¼ã«ããã¯å¼ã³åºãã®æå¾ã®è¿å¤ã§ãã (10) ã«ãªãã¾ãã
åæå¤ãããå ´åã® reduceRight() ã®åä½
ããã§ã¯ãåãã¢ã«ã´ãªãºã ã使ç¨ãã¦åãé
åã縮å°ãã¾ããã reduceRight() ã® 2 ã¤ç®ã®å¼æ°ã§ãã initialValue ã¨ã㦠10 ã使ç¨ãã¾ãã
[0, 1, 2, 3, 4].reduceRight(
(accumulator, currentValue, index, array) => accumulator + currentValue,
10,
);
accumulator |
currentValue |
index |
Return value | |
|---|---|---|---|---|
| First call | 10 |
4 |
4 |
14 |
| Second call | 14 |
3 |
3 |
17 |
| Third call | 17 |
2 |
2 |
19 |
| Fourth call | 19 |
1 |
1 |
20 |
| Fifth call | 20 |
0 |
0 |
20 |
reduceRight ããè¿ãããå¤ã¯ãã®ã¨ãã®ãã®ã§ããã¡ãã 20 ã§ãã
é åå ã®ãã¹ã¦ã®å¤ãåè¨ãã
const sum = [0, 1, 2, 3].reduceRight((a, b) => a + b);
// sum is 6
ä¸é£ã®ã³ã¼ã«ããã¯ã使ç¨ãã¦éåæé¢æ°ã®ãªã¹ããå®è¡ããããããã®çµæã次ã®ã³ã¼ã«ããã¯ã«æ¸¡ã
const waterfall =
(...functions) =>
(callback, ...args) =>
functions.reduceRight(
(composition, fn) =>
(...results) =>
fn(composition, ...results),
callback,
)(...args);
const randInt = (max) => Math.floor(Math.random() * max);
const add5 = (callback, x) => {
setTimeout(callback, randInt(1000), x + 5);
};
const mul3 = (callback, x) => {
setTimeout(callback, randInt(1000), x * 3);
};
const sub2 = (callback, x) => {
setTimeout(callback, randInt(1000), x - 2);
};
const split = (callback, x) => {
setTimeout(callback, randInt(1000), x, x);
};
const add = (callback, x, y) => {
setTimeout(callback, randInt(1000), x + y);
};
const div4 = (callback, x) => {
setTimeout(callback, randInt(1000), x / 4);
};
const computation = waterfall(add5, mul3, sub2, split, add, div4);
computation(console.log, 5); // 14 ããã°åºå
// 次ã®ãã®ã¨åã
const computation2 = (input, callback) => {
const f6 = (x) => div4(callback, x);
const f5 = (x, y) => add(f6, x, y);
const f4 = (x) => split(f5, x);
const f3 = (x) => sub2(f4, x);
const f2 = (x) => mul3(f3, x);
add5(f2, input);
};
reduce 㨠reduceRight ã®éã
const a = ["1", "2", "3", "4", "5"];
const left = a.reduce((prev, cur) => prev + cur);
const right = a.reduceRight((prev, cur) => prev + cur);
console.log(left); // "12345"
console.log(right); // "54321"
åæå¯è½ãªé¢æ°ã®å®ç¾©
颿°åæã¨ã¯ãå颿°ã®åºåãæ¬¡ã®é¢æ°ã«æ¸¡ããæå¾ã®é¢æ°ã®åºåãæçµçãªçµæã¨ããã颿°ãçµã¿åãããããã®ä»çµã¿ã§ãããã®ä¾ã§ã¯ reduceRight() ã使ã£ã¦ã颿°åæãå®ç¾ãã¦ãã¾ãã
Wikipedia ã® Function composition ãåç §ãã¦ãã ããã
const compose =
(...args) =>
(value) =>
args.reduceRight((acc, fn) => fn(acc), value);
// 渡ãããæ°å¤ãã¤ã³ã¯ãªã¡ã³ããã
const inc = (n) => n + 1;
// 渡ãããæ°å¤ã 2 åã«ãã
const double = (n) => n * 2;
// åæé¢æ°ã使ç¨ãã
console.log(compose(double, inc)(2)); // 6
// åæé¢æ°ã使ç¨ãã
console.log(compose(inc, double)(2)); // 5
reduceRight() ãçé åã§ä½¿ç¨
reduceRight() ã¯çé
åã®æ¬ è½ãã¦ããè¦ç´ ãã¹ããããã¾ãããå¤ã undefined ã®å ´åã¯ã¹ããããã¾ããã
console.log([1, 2, , 4].reduceRight((a, b) => a + b)); // 7
console.log([1, 2, undefined, 4].reduceRight((a, b) => a + b)); // NaN
é å以å¤ã®ãªãã¸ã§ã¯ãã«å¯¾ãã reduceRight() ã®å¼ã³åºã
reduceRight() ã¡ã½ãã㯠this ã® length ããããã£ãèªã¿è¾¼ã¿ã次ã«ãã¼ã length ããå°ããéè² ã®æ´æ°ã§ããåããããã£ã«ã¢ã¯ã»ã¹ãã¾ãã
const arrayLike = {
length: 3,
0: 2,
1: 3,
2: 4,
3: 99, // length ã 3 ã§ãããã reduceRight() ããã¯ç¡è¦ããã
};
console.log(Array.prototype.reduceRight.call(arrayLike, (x, y) => x - y));
// -1 ããªãã¡ 4 - 3 - 2
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-array.prototype.reduceright > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
Array.prototype.reduceRightã®ããªãã£ã« (core-js)- es-shims ã«ãã
Array.prototype.reduceRightã®ããªãã£ã« - ã¤ã³ããã¯ã¹ä»ãã³ã¬ã¯ã·ã§ã³ã®ã¬ã¤ã
ArrayArray.prototype.map()Array.prototype.flat()Array.prototype.flatMap()Array.prototype.reduce()TypedArray.prototype.reduceRight()Object.groupBy()Map.groupBy()