الدليل الشامل لطرق مصفوفة JavaScript - تقليل
reduce()
تقلل هذه الطريقة مجموعة من القيم إلى قيمة واحدة فقط. يمكن أن تكون القيمة الفردية التي يتم إرجاعها من أي نوع.
reduce()
يشبه سكين الجيش السويسري لطرق المصفوفة. في حين أن آخرين مثل map()
و filter()
توفير وظائف محددة، reduce()
يمكن استخدامها لتحويل مجموعة مدخلات الانتاج أي تريدها، كل مع الحفاظ على مجموعة الأصلي.
بناء الجملة
const newValue = arr.reduce(function(accumulator, currentValue, index, array) { // Do stuff with accumulator and currentValue (index, array, and initialValue are optional) }, initialValue);
newValue
- الرقم الجديد أو المصفوفة أو السلسلة أو العنصر الذي تم إرجاعهarr
- المصفوفة الجاري تشغيلهاaccumulator
- القيمة المرجعة للتكرار السابقcurrentValue
- العنصر الحالي في المصفوفةindex
- فهرس العنصر الحاليarray
- المصفوفة الأصلية التيreduce()
تم استدعاءهاinitialValue
- رقم أو مصفوفة أو سلسلة أو كائن يعمل كقيمة أولية للإخراج النهائي
أمثلة
ES5
var numbers = [1, 2, 3]; var sum = numbers.reduce(function(total, current) { return total + current; }, 0); console.log(numbers); // [1, 2, 3] console.log(sum); // 6
ES6
const numbers = [1, 2, 3]; const sum = numbers.reduce((total, current) => { return total + current; }, 0); const sumOneLiner = numbers.reduce((total, current) => total + current, 0); console.log(numbers); // [1, 2, 3] console.log(sum); // 6 console.log(sumOneLiner); // 6
كل شيء عن initialValue
initialValue
قدمت
و initialValue
الحجة هي اختيارية. إذا تم توفيرها ، فسيتم استخدامها كقيمة تراكمية أولية ( total
) في الاستدعاء الأول لوظيفة رد الاتصال:
const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }, 1); console.log(product); // 24
نظرًا لأن initialValue
1 يتم توفيره بعد وظيفة رد النداء ، reduce()
يبدأ في بداية المصفوفة ويعين العنصر الأول (2) كقيمة حالية ( current
). ثم يتكرر خلال بقية المصفوفة ، محدثًا قيمة المجمع والقيمة الحالية على طول الطريق.
initialValue
محذوف
إذا initialValue
لم يتم توفيره ، فسيبدأ التكرار عند العنصر الثاني في المصفوفة (في الفهرس 1) ، مع accumulator
مساوٍ للعنصر الأول في المصفوفة currentValue
ويساوي العنصر الثاني:
const numbers = [2, 3, 4]; const product = numbers.reduce((total, current) => { return total * current; }); console.log(product);
في هذا المثال ، لا initialValue
يتم توفير no ، لذلك يتم reduce()
تعيين العنصر الأول من المصفوفة كقيمة تراكمية ( total
تساوي 2) ، وتعيين العنصر الثاني من المصفوفة كقيمة حالية ( currentValue
تساوي 3). ثم يتكرر خلال بقية المصفوفة.
عند تصغير مجموعة من السلاسل:
const strings = ['one', 'two', 'three']; const numberString = strings.reduce((acc, curr) => { return acc + ', ' + curr; }); console.log(numberString); // "one, two, three"
في حين أنه من السهل حذف المعامل initialValue
إذا كان التابع الخاص بك reduce()
سيعيد عددًا أو سلسلة بسيطة ، يجب عليك تضمين واحد إذا كان سيعيد مصفوفة أو كائن.
إرجاع كائن
يعد تحويل مجموعة من السلاسل إلى كائن واحد يوضح عدد المرات التي تظهر فيها كل سلسلة في المصفوفة أمرًا بسيطًا. ما عليك سوى تمرير كائن فارغ ( {}
) على النحو التالي initialValue
:
const pets = ["dog", "chicken", "cat", "dog", "chicken", "chicken", "rabbit"]; const petCounts = pets.reduce(function(obj, pet) { if (!obj[pet]) { // if the pet doesn't yet exist as a property of the accumulator object, // add it as a property and set its count to 1 obj[pet] = 1; } else { // pet exists, so increment its count obj[pet]++; } return obj; // return the modified object to be used as accumulator in the next iteration }, {}); // initialize the accumulator as an empty object console.log(petCounts); /* { dog: 2, chicken: 3, cat: 1, rabbit: 1 } */
العودة والصفيف
بشكل عام ، إذا كنت تخطط لإرجاع مصفوفة ، map()
فغالبًا ما يكون الخيار الأفضل. يخبر المترجم (والآخرين الذين يقرؤون الكود الخاص بك) أن كل عنصر في المصفوفة الأصلية سيتم تحويله وإعادته كمصفوفة جديدة متساوية الطول.
من ناحية أخرى ، reduce()
يشير إلى أن جميع عناصر المصفوفة الأصلية ستتحول إلى قيمة جديدة. يمكن أن تكون هذه القيمة الجديدة مصفوفة ، قد يكون طولها مختلفًا عن الأصل.
لنفترض أن لديك قائمة تسوق كمجموعة من السلاسل ، لكنك تريد إزالة جميع الأطعمة التي لا تحبها من القائمة. يمكنك استخدامه filter()
لتصفية كل ما لا يعجبك map()
وإرجاع مجموعة جديدة من السلاسل ، أو يمكنك فقط استخدام reduce()
:
const shoppingList = ['apples', 'mangoes', 'onions', 'cereal', 'carrots', 'eggplants']; const foodsIDontLike = ['onions', 'eggplants']; const newShoppingList = shoppingList.reduce((arr, curr) => { if (!foodsIDontLike.includes(curr)) { arr.push(curr); } return arr; }, []); console.log(newShoppingList); // ["apples", "mangoes", "cereal", "carrots"]
هذا كل ما تحتاج لمعرفته حول reduce()
الطريقة. مثل سكين الجيش السويسري ، فهي ليست دائمًا أفضل أداة للوظيفة. لكنك ستسعد بوجودها في جيبك الخلفي عندما تحتاجها حقًا.