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 |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.