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 مرةً واحدةً لكل عنصر في المصفوفة، باستثناء الفجوات الموجودة في المصفوفة، وهذه الدالة تقبل أربعة وسائط:
accumulatorcurrentValuecurrentIndexarray
في أوّل استدعاء للدالة 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 |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.