Array.prototype.reduceRight()‎

من موسوعة حسوب

الدالة Array.prototype.reduceRight()‎ تؤدي إلى اختزال جميع قيم المصفوفة (بدءًا من اليمين إلى اليسار) إلى قيمة واحدة.

var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
    return a.concat(b);
}, []);

// [4, 5, 2, 3, 0, 1]

انظر صفحة الدالة Array.prototype.reduce()‎ لاختزال القيم من اليسار إلى اليمين.

البنية العامة

arr.reduceRight(callback[, initialValue])

callback

الدالة التي ستختبر كل عنصر من عناصر المصفوفة، وتقبل أربعة وسائط.

previousValue

القيمة السابقة، انظر النقاش أدناه للتفاصيل.

currentValue

العنصر الحالي الذي يُعالِج في المصفوفة، وهذه القيمة مطلوبة.

currentIndex

فهرس العنصر الحالي في المصفوفة، وهذه القيمة اختيارية.

array

المصفوفة التي استدعيت الدالة reduce عليها، وهذه القيمة اختيارية.

initialValue

القيمة التي ستُستخدم كوسيط لأوّل استدعاء للدالة callback، وإن لم توفَّر هذه القيمة فسيستخدم أوّل عنصر في المصفوفة.

القيمة المعادة

القيمة الناتجة من عملية الاختزال.

الوصف

الدالة reduceRight تستدعي الدالة callback مرةً واحدةً لكل عنصر في المصفوفة، باستثناء الفجوات الموجودة في المصفوفة، وهذه الدالة تقبل أربعة وسائط:

  • accumulator
  • currentValue
  • currentIndex
  • array

في أوّل استدعاء للدالة callback، تكون previousValue و currentValue قيمةً من قيمتين. فإذا وفّرنا قيمةً للوسيط initialValue عند استدعاء reduceRight فستكون previousValue مساويةً إلى initialValue، وستكون currentValue مساويةً إلى آخر عنصر في المصفوفة؛ أما إذا لم تكن قيمة الوسيط initialValue موجودةً، فستكون previousValue مساويةً لآخر قيمة في المصفوفة، و currentValue ستساوي القيمة قبل الأخيرة.

إذا كانت المصفوفة فارغة ولم توفَّر قيمة initialValue، فسيرمى الاستثناء TypeError، وإذا احتوت المصفوفة على عنصرٍ وحيد (بغض النظر عن موضعه) ولم توفَّر قيمة initialValue أو كانت القيمة initialValue موجودةً لكن المصفوفة فارغة، فستُعاد القيمة الوحيدة دون استدعاء الدالة callback.

لنفترض أنَّ لدينا المثال الآتي:

[0, 1, 2, 3, 4].reduceRight(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
});

ستُستدعى الدالة callback أربع مرات، وسنستعرض الوسائط الممررة إليها والقيم التي تعيدها في الجدول الآتي:

callback accumulator currentValue currentIndex array القيمة المعادة
أوّل استدعاء 4 3 3 ‎[0, 1, 2, 3, 4]‎‎ 7
ثاني استدعاء 7 2 2 ‎[0, 1, 2, 3, 4]‎‎ 9
ثالث استدعاء 9 1 1 ‎[0, 1, 2, 3, 4]‎‎ 10
رابع استدعاء 10 0 0 ‎[0, 1, 2, 3, 4]‎‎ 10

القيمة المعادة من الدالة reduceRight هي آخر قيمة مُعادة من الدالة callback (وهي 10).

أما إذا وفّرتَ قيمةً ابتدائيةً كوسيطٍ ثانٍ للدالة reduceRight، أي أنَّ الشيفرة كالآتية:

[0, 1, 2, 3, 4].reduceRight(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
}, 10);

الجدول:

callback accumulator currentValue currentIndex array القيمة المعادة
أوّل استدعاء 10 4 4 ‎[0, 1, 2, 3, 4]‎‎ 14
ثاني استدعاء 14 3 3 ‎[0, 1, 2, 3, 4]‎‎ 17
ثالث استدعاء 17 2 2 ‎[0, 1, 2, 3, 4]‎‎ 20
رابع استدعاء 20 0 0 ‎[0, 1, 2, 3, 4]‎‎ 20

القيمة المعادة من الدالة reduceRight في هذه الحالة هي 20.

أمثلة

جمع كل القيم في المصفوفة

var sum = [0, 1, 2, 3].reduceRight(function(a, b) {
  return a + b;
});
// 6

تسطيح مصفوفة من المصفوفات

var flattened = [[0, 1], [2, 3], [4, 5]].reduceRight(function(a, b) {
    return a.concat(b);
}, []);
// [4, 5, 2, 3, 0, 1]

الفرق بين reduce و reduceRight

var a = ['1', '2', '3', '4', '5']; 
var left  = a.reduce(function(prev, cur)      { return prev + cur; }); 
var right = a.reduceRight(function(prev, cur) { return prev + cur; }); 

console.log(left);  // "12345"
console.log(right); // "54321"

تعويض نقص دعم المتصفحات

أضيفت هذه الدالة في الإصدار الخامس من معيار ECMAScript، لذا يمكنك استخدام الشيفرة الآتية لإضافتها للمتصفحات التي لا تدعمها:

// Production steps of ECMA-262, Edition 5, 15.4.4.22
// Reference: http://es5.github.io/#x15.4.4.22
if ('function' !== typeof Array.prototype.reduceRight) {
  Array.prototype.reduceRight = function(callback /*, initialValue*/) {
    'use strict';
    if (null === this || 'undefined' === typeof this) {
      throw new TypeError('Array.prototype.reduce called on null or undefined');
    }
    if ('function' !== typeof callback) {
      throw new TypeError(callback + ' is not a function');
    }
    var t = Object(this), len = t.length >>> 0, k = len - 1, value;
    if (arguments.length >= 2) {
      value = arguments[1];
    } else {
      while (k >= 0 && !(k in t)) {
        k--;
      }
      if (k < 0) {
        throw new TypeError('Reduce of empty array with no initial value');
      }
      value = t[k--];
    }
    for (; k >= 0; k--) {
      if (k in t) {
        value = callback(value, t[k], k, t);
      }
    }
    return value;
  };
}

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم 9 10.5 4

مصادر ومواصفات