ๆญค้กต้ข็”ฑ็คพๅŒบไปŽ่‹ฑๆ–‡็ฟป่ฏ‘่€Œๆฅใ€‚ไบ†่งฃๆ›ดๅคšๅนถๅŠ ๅ…ฅ MDN Web Docs ็คพๅŒบใ€‚

View in English Always switch to English

Array.prototype.reduceRight()

Baseline Widely available

This feature is well established and works across many devices and browser versions. Itโ€™s been available across browsers since โจ2015ๅนด7ๆœˆโฉ.

reduceRight() ๆ–นๆณ•ๅฏน็ดฏๅŠ ๅ™จ๏ผˆaccumulator๏ผ‰ๅ’Œๆ•ฐ็ป„็š„ๆฏไธชๅ€ผ๏ผˆๆŒ‰ไปŽๅณๅˆฐๅทฆ็š„้กบๅบ๏ผ‰ๅบ”็”จไธ€ไธชๅ‡ฝๆ•ฐ๏ผŒๅนถไฝฟๅ…ถๆˆไธบๅ•ไธชๅ€ผใ€‚

ๅฏนไบŽไปŽๅทฆ่‡ณๅณ้ๅކ็š„็›ธไผผๆ–นๆณ•๏ผŒ่ฏทๅ‚้˜… Array.prototype.reduce()ใ€‚

ๅฐ่ฏ•ไธ€ไธ‹

const array1 = [
  [0, 1],
  [2, 3],
  [4, 5],
];

const result = array1.reduceRight((accumulator, currentValue) =>
  accumulator.concat(currentValue),
);

console.log(result);
// Expected output: Array [4, 5, 2, 3, 0, 1]

่ฏญๆณ•

js
reduceRight(callbackFn)
reduceRight(callbackFn, initialValue)

ๅ‚ๆ•ฐ

callbackFn

ไธบๆ•ฐ็ป„ไธญ็š„ๆฏไธชๅ…ƒ็ด ๆ‰ง่กŒ็š„ๅ‡ฝๆ•ฐใ€‚ๅ…ถ่ฟ”ๅ›žๅ€ผๅฐ†ไฝœไธบไธ‹ไธ€ๆฌก่ฐƒ็”จ callbackFn ๆ—ถ็š„ accumulator ๅ‚ๆ•ฐใ€‚ๅฏนไบŽๆœ€ๅŽไธ€ๆฌก่ฐƒ็”จ๏ผŒ่ฟ”ๅ›žๅ€ผๅฐ†ๆˆไธบ reduceRight() ็š„่ฟ”ๅ›žๅ€ผใ€‚่ฏฅๅ‡ฝๆ•ฐ่ขซ่ฐƒ็”จๆ—ถๅฐ†ไผ ๅ…ฅไปฅไธ‹ๅ‚ๆ•ฐ๏ผš

accumulator

ไธŠไธ€ๆฌก่ฐƒ็”จ callbackFn ็š„็ป“ๆžœใ€‚ๅœจ็ฌฌไธ€ๆฌก่ฐƒ็”จๆ—ถ๏ผŒๅฆ‚ๆžœๆŒ‡ๅฎšไบ† initialValue ๅˆ™ไธบๆŒ‡ๅฎš็š„ๅ€ผ๏ผŒๅฆๅˆ™ไธบๆ•ฐ็ป„ๆœ€ๅŽไธ€ไธชๅ…ƒ็ด ็š„ๅ€ผใ€‚

currentValue

ๆ•ฐ็ป„ไธญๅฝ“ๅ‰ๆญฃๅœจๅค„็†็š„ๅ…ƒ็ด ใ€‚

index

ๆญฃๅœจๅค„็†็š„ๅ…ƒ็ด ๅœจๆ•ฐ็ป„ไธญ็š„็ดขๅผ•ใ€‚

array

่ฐƒ็”จไบ† reduceRight() ็š„ๆ•ฐ็ป„ๆœฌ่บซใ€‚

initialValue ๅฏ้€‰

้ฆ–ๆฌก่ฐƒ็”จ callbackFn ๆ—ถ็ดฏๅŠ ๅ™จ็š„ๅ€ผใ€‚ๅฆ‚ๆžœไธๆไพ›ๅˆๅง‹ๅ€ผ๏ผŒๅˆ™ๅฐ†ไฝฟ็”จๆ•ฐ็ป„ไธญ็š„ๆœ€ๅŽไธ€ไธชๅ…ƒ็ด ๏ผŒๅนถๅœจ่ฟญไปฃๆ—ถ่ทณ่ฟ‡ๅฎƒใ€‚ๆฒกๆœ‰ๅˆๅง‹ๅ€ผ็š„ๆƒ…ๅ†ตไธ‹๏ผŒๅœจ็ฉบๆ•ฐ็ป„ไธŠ่ฐƒ็”จ reduceRight() ไผšไบง็”Ÿ TypeErrorใ€‚

่ฟ”ๅ›žๅ€ผ

่šๅˆๅŽ็š„็ป“ๆžœๅ€ผใ€‚

ๆ่ฟฐ

reduceRight() ๆ–นๆณ•ๆ˜ฏไธ€ไธช่ฟญไปฃๆ–นๆณ•ใ€‚ๅฎƒไธบๆ•ฐ็ป„ไธญ็š„ๆ‰€ๆœ‰ๅ…ƒ็ด ้™ๅบ่ฐƒ็”จโ€œreducerโ€ๅ›ž่ฐƒๅ‡ฝๆ•ฐ๏ผŒๅนถๅฐ†ๅฎƒไปฌ็ดฏ็งฏๅˆฐไธ€ไธชๅ•ไธ€็š„ๅ€ผไธญใ€‚

callbackFn ไป…ไธบๅทฒๅˆ†้…ๅ€ผ็š„ๆ•ฐ็ป„็ดขๅผ•่ฐƒ็”จใ€‚ๅฎƒไธไผšไธบ็จ€็–ๆ•ฐ็ป„ไธญ็š„็ฉบๆงฝ่ฐƒ็”จใ€‚

ไธŽๅ…ถไป–่ฟญไปฃๆ–นๆณ•ไธๅŒ๏ผŒreduceRight() ไธๆŽฅๅ— thisArg ๅ‚ๆ•ฐใ€‚callbackFn ่ฐƒ็”จๆ—ถๅง‹็ปˆไปฅ undefined ไฝœไธบ this ็š„ๅ€ผ๏ผŒๅฆ‚ๆžœ callbackFn ๆœชๅค„ไบŽไธฅๆ ผๆจกๅผ๏ผŒๅˆ™่ฏฅๅ€ผๅฐ†่ขซๆ›ฟๆขไธบ globalThisใ€‚

reduceRight() ไธไผšๆ”นๅ˜่ขซ่ฐƒ็”จ็š„ๆ•ฐ็ป„๏ผŒไฝ†ๆ˜ฏไฝœไธบ callbackFn ๆไพ›็š„ๅ‡ฝๆ•ฐๅฏ่ƒฝไผšๆ”นๅ˜ๆ•ฐ็ป„ใ€‚ไฝ†้œ€่ฆๆณจๆ„็š„ๆ˜ฏ๏ผŒๅœจ็ฌฌไธ€ๆฌก่ฐƒ็”จ callbackFn ไน‹ๅ‰๏ผŒๆ•ฐ็ป„็š„้•ฟๅบฆไผš่ขซไฟๅญ˜ใ€‚ๅ› ๆญค๏ผš

  • ๅฝ“ๅผ€ๅง‹่ฐƒ็”จ reduceRight() ๆ—ถ๏ผŒcallbackFn ๅฐ†ไธไผš่ฎฟ้—ฎ่ถ…ๅ‡บๆ•ฐ็ป„ๅˆๅง‹้•ฟๅบฆ็š„ไปปไฝ•ๅ…ƒ็ด ใ€‚
  • ๅฏนๅทฒ่ฎฟ้—ฎ็ดขๅผ•็š„ๆ›ดๆ”นไธไผšๅฏผ่‡ดๅ†ๆฌกๅœจ่ฟ™ไบ›ๅ…ƒ็ด ไธŠ่ฐƒ็”จ callbackFnใ€‚
  • ๅฆ‚ๆžœๆ•ฐ็ป„ไธญไธ€ไธช็Žฐๆœ‰็š„ใ€ๅฐšๆœช่ฎฟ้—ฎ็š„ๅ…ƒ็ด ่ขซ callbackFn ๆ›ดๆ”น๏ผŒๅˆ™ๅฎƒไผ ้€’็ป™ callbackFn ็š„ๅ€ผๅฐ†ๆ˜ฏ่ฏฅๅ…ƒ็ด ่ขซไฟฎๆ”นๅŽ็š„ๅ€ผใ€‚่ขซๅˆ ้™ค็š„ๅ…ƒ็ด ๅˆ™ไธไผš่ขซ่ฎฟ้—ฎใ€‚

่ญฆๅ‘Š๏ผš ไธŠ่ฟฐ็ฑปๅž‹็š„ๅนถๅ‘ไฟฎๆ”น็ปๅธธๅฏผ่‡ด้šพไปฅ็†่งฃ็š„ไปฃ็ ๏ผŒ้€šๅธธๅบ”้ฟๅ…๏ผˆ็‰นๆฎŠๆƒ…ๅ†ต้™คๅค–๏ผ‰ใ€‚

reduceRight() ๆ–นๆณ•ๆ˜ฏ้€š็”จ็š„ใ€‚ๅฎƒๅชๆœŸๆœ› this ๅ€ผๅ…ทๆœ‰ length ๅฑžๆ€งๅ’Œๆ•ดๆ•ฐ้”ฎๅฑžๆ€งใ€‚

็คบไพ‹

ๆ— ๅˆๅง‹ๅ€ผๆ—ถ reduceRight() ๅฆ‚ไฝ•่ฟ่กŒ

reduceRight() ๆ–นๆณ•่ฐƒ็”จ callbackFn ็š„ๆ ผๅผๅฆ‚ไธ‹๏ผš

js
arr.reduceRight((accumulator, currentValue, index, array) => {
  // โ€ฆ
});

ๅœจ็ฌฌไธ€ๆฌก่ฐƒ็”จๅ‡ฝๆ•ฐๆ—ถ๏ผŒaccumulator ๅ’Œ currentValue ็š„ๅฏ่ƒฝๅ–ๅ€ผๆƒ…ๅ†ตๆœ‰ไธค็งใ€‚ๅฆ‚ๆžœๅœจ่ฐƒ็”จ reduceRight ๆ—ถๆไพ›ไบ† initialValue๏ผŒ้‚ฃไนˆ accumulator ๅฐ†็ญ‰ไบŽ initialValue๏ผŒ่€Œ currentValue ๅฐ†็ญ‰ไบŽๆ•ฐ็ป„ไธญ็š„ๆœ€ๅŽไธ€ไธชๅ€ผใ€‚ๅฆ‚ๆžœๆฒกๆœ‰ๆไพ› initialValue๏ผŒๅˆ™ accumulator ๅฐ†็ญ‰ไบŽๆ•ฐ็ป„ไธญ็š„ๆœ€ๅŽไธ€ไธชๅ€ผ๏ผŒ่€Œ currentValue ๅฐ†็ญ‰ไบŽๅ€’ๆ•ฐ็ฌฌไบŒไธชๅ€ผใ€‚

ๅฆ‚ๆžœๆ•ฐ็ป„ไธบ็ฉบไธ”ๆฒกๆœ‰ๆไพ› initialValue๏ผŒๅˆ™ไผšๆŠ›ๅ‡บ TypeError ๅผ‚ๅธธใ€‚ๅฆ‚ๆžœๆ•ฐ็ป„ๅชๆœ‰ไธ€ไธชๅ…ƒ็ด ๏ผˆๆ— ่ฎบๅ…ถไฝ็ฝฎๅฆ‚ไฝ•๏ผ‰ไธ”ๆฒกๆœ‰ๆไพ› initialValue๏ผŒๆˆ–่€…ๆไพ›ไบ† initialValue ไฝ†ๆ•ฐ็ป„ไธบ็ฉบ๏ผŒๅˆ™็›ดๆŽฅ่ฟ”ๅ›ž่ฏฅๅ•ไธชๅ€ผ๏ผŒไธ” callbackFn ไธไผš่ขซ่ฐƒ็”จใ€‚

่ฟ™ไธชๅ‡ฝๆ•ฐ็š„ไธ€ไบ›็คบไพ‹่ฟ่กŒๅฆ‚ไธ‹๏ผš

js
[0, 1, 2, 3, 4].reduceRight(
  (accumulator, currentValue, index, array) => accumulator + currentValue,
);

ไธ€ๅ…ฑไผš่ฐƒ็”จๅ››ๆฌกๅ›ž่ฐƒๅ‡ฝๆ•ฐ๏ผŒๆฏๆฌก่ฐƒ็”จ็š„ๅ‚ๆ•ฐๅŠ่ฟ”ๅ›žๅ€ผๅฆ‚ไธ‹๏ผš

accumulator currentValue index ่ฟ”ๅ›žๅ€ผ
็ฌฌไธ€ๆฌก่ฐƒ็”จ 4 3 3 7
็ฌฌไบŒๆฌก่ฐƒ็”จ 7 2 2 9
็ฌฌไธ‰ๆฌก่ฐƒ็”จ 9 1 1 10
็ฌฌๅ››ๆฌก่ฐƒ็”จ 10 0 0 10

array ๅ‚ๆ•ฐๅœจๆ•ดไธช่ฟ‡็จ‹ไธญๅง‹็ปˆไธๅ˜๏ผŒๅง‹็ปˆไธบ [0, 1, 2, 3, 4]ใ€‚reduceRight ่ฟ”ๅ›ž็š„ๅ€ผๅฐ†ๆ˜ฏๆœ€ๅŽไธ€ๆฌกๅ›ž่ฐƒๅ‡ฝๆ•ฐ่ฐƒ็”จ็š„่ฟ”ๅ›žๅ€ผ๏ผˆ10๏ผ‰ใ€‚

ๆœ‰ๅˆๅง‹ๅ€ผๆ—ถ reduceRight() ๅฆ‚ไฝ•่ฟ่กŒ

่ฟ™้‡Œๆˆ‘ไปฌไฝฟ็”จ็›ธๅŒ็š„็ฎ—ๆณ•ๅฏนๅŒไธ€ๆ•ฐ็ป„่ฟ›่กŒ reduce๏ผŒไฝ†ๆ˜ฏๅฐ† initialValue ๅ‚ๆ•ฐ่ฎพ็ฝฎไธบ 10๏ผŒไฝœไธบ็ฌฌไบŒไธชๅ‚ๆ•ฐไผ ้€’็ป™ reduceRight() ๆ–นๆณ•๏ผš

js
[0, 1, 2, 3, 4].reduceRight(
  (accumulator, currentValue, index, array) => accumulator + currentValue,
  10,
);
accumulator currentValue index ่ฟ”ๅ›žๅ€ผ
็ฌฌไธ€ๆฌก่ฐƒ็”จ 10 4 4 14
็ฌฌไบŒๆฌก่ฐƒ็”จ 14 3 3 17
็ฌฌไธ‰ๆฌก่ฐƒ็”จ 17 2 2 19
็ฌฌๅ››ๆฌก่ฐƒ็”จ 19 1 1 20
็ฌฌไบ”ๆฌก่ฐƒ็”จ 20 0 0 20

่ฟ™ๆฌก๏ผŒreduceRight ่ฟ”ๅ›žๅ€ผไธบ 20ใ€‚

ๆฑ‚ไธ€ไธชๆ•ฐ็ป„ไธญๆ‰€ๆœ‰ๅ€ผ็š„ๅ’Œ

js
const sum = [0, 1, 2, 3].reduceRight((a, b) => a + b);
// sum ็š„ๅ€ผๆ˜ฏ 6

ๅฑ•ๅนณไธ€ไธชไบŒ็ปดๆ•ฐ็ป„

js
const arrays = [
  [0, 1],
  [2, 3],
  [4, 5],
];
const flattened = arrays.reduceRight((a, b) => a.concat(b), []);
// flattened ็š„ๅ€ผๆ˜ฏ [4, 5, 2, 3, 0, 1]

ไธฒ่”่ฟ่กŒไธ€ๅˆ—ๅผ‚ๆญฅๅ‡ฝๆ•ฐ๏ผŒๆฏไธชๅ‡ฝๆ•ฐ้ƒฝๅฐ†ๅ…ถ็ป“ๆžœไผ ็ป™ไธ‹ไธ€ไธชๅ‡ฝๆ•ฐ

js
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 mult3 = (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, mult3, sub2, split, add, div4);
computation(console.log, 5); // Logs 14

// same as:

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) => mult3(f3, x);
  add5(f2, input);
};

reduce ไธŽ reduceRight ไน‹้—ด็š„ๅŒบๅˆซ

js
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() ๆฅๅฎž็Žฐๅ‡ฝๆ•ฐ็ป„ๅˆใ€‚

ๅ‚่ง็ปดๅŸบ็™พ็ง‘ไธŠ็š„ๅ‡ฝๆ•ฐ็ป„ๅˆใ€‚

js
const compose =
  (...args) =>
  (value) =>
    args.reduceRight((acc, fn) => fn(acc), value);

// Increment passed number
const inc = (n) => n + 1;

// Doubles the passed value
const double = (n) => n * 2;

// using composition function
console.log(compose(double, inc)(2)); // 6

// using composition function
console.log(compose(inc, double)(2)); // 5

ๅœจ็จ€็–ๆ•ฐ็ป„ไธญไฝฟ็”จ reduceRight()

reduceRight() ไผš่ทณ่ฟ‡็จ€็–ๆ•ฐ็ป„ไธญ็ผบๅคฑ็š„ๅ…ƒ็ด ๏ผŒไฝ†ไธไผš่ทณ่ฟ‡ undefined ๅ€ผใ€‚

js
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 ๅฑžๆ€ง๏ผŒ็„ถๅŽ่ฎฟ้—ฎๆฏไธชๆ•ดๆ•ฐ็ดขๅผ•ใ€‚

js
const arrayLike = {
  length: 3,
  0: 2,
  1: 3,
  2: 4,
};
console.log(Array.prototype.reduceRight.call(arrayLike, (x, y) => x - y));
// -1, ๅณ 4 - 3 - 2

่ง„่Œƒ

Specification
ECMAScriptยฎ 2026 Language Specification
# sec-array.prototype.reduceright

ๆต่งˆๅ™จๅ…ผๅฎนๆ€ง

ๅ‚่ง