طرق تكرار الصفيف (خريطة ، عامل تصفية ، تقليل)
لغة JavaScript لها تفضيل واضح للمصفوفات على هياكل البيانات الأخرى. لديهم الكثير من الحيل المحددة والمريحة ، على سبيل المثال ، مجموعة كاملة من طرق التكرار: map
, filter
, reduce
.
خريطة
ال map ()
طريقة تخلق مصفوفة с جديدة نتيجة استدعاء الوظيفة المحددة ⚙️ لكل عنصر من عناصر المصفوفة.
بناء الجملة
let new_array = arr.map(function callback( currentValue[, index[, array]]) {
// Returns the item for new_array
}[, thisArg])
ال map
طريقة استدعاء تمرير callback
تعمل مرة واحدة لكل عنصر ، بترتيب حدوثها ، وتقوم ببناء مصفوفة جديدة من نتائج استدعائها. يتم استدعاء وظيفة "callback" فقط لفهارس المصفوفة التي تم تعيين قيم لها ، بما في ذلك "undefined". لا يتم استدعاؤه لعناصر الصفيف المفقودة (أي للفهارس التي لم يتم تحديدها أو حذفها أو تعيين قيمة لها مطلقًا).
يتم استدعاء الدالة ⚙️ رد الاتصال
بثلاث وسيطات:
- قيمة العنصر ،
- فهرس العنصر
- والمصفوفة التي يتم من خلالها المرور.
إذا كان thisArg
تم تمرير المعلمة إلى map
الطريقة ، سيتم استخدامها على أنهاthis
قيمة متىcallback
يسمى. وإلا فإن this
ستكون القيمةundefined
. في النهاية ، قيمةthis
كما رأينا من callback
يتم تحديد الوظيفة وفقًا للقواعد المعتادة للتعريف this
كما رأينا من وظيفة.
لا يعدل التابع "map" المصفوفة التي تم استدعاؤها (على الرغم من أن الوظيفة ⚙️ يمكنها القيام بذلك!).
نطاق العناصر التي تتم معالجتها بواسطة ملفmap
تم تعيين الطريقة قبل المكالمة الأولى إلىcallback
وظيفة. تمت إضافة العناصر إلى المصفوفة بعد بداية ملفmap
الطريقة لن يتم زيارتها من قبل callback
وظيفة. إذا تم تعديل العناصر الموجودة في المصفوفة بواسطةcallback
function, their values passed to the function will be the values at the time when the map
طريقة زياراتهم. العناصر المحذوفة لن تتم زيارتها.
أمثلة:
مثال بسيط
لديك مصفوفة تحتوي على العديد من العناصر ، كل منها يمثل شخصًا مختلفًا. يمكن أن يكون هناك الكثير من البيانات هنا: الاسم والعمر ولون الشعر والشخصية المفضلة من السينما ، ولكن في الوقت الحالي كل هذا غير مطلوب - ما عليك سوى الحصول على مجموعة من أرقام جوازات السفر لهؤلاء الأشخاص لمنحهم جميع تصاريح المؤتمر.
في بعض الحالات ، قد تحتاج إلى عرض مصفوفة من الكائنات ذات المفاتيح المحددة كسلسلة:
إنشاء مصفوفة قيم فهرنهايت من مصفوفة قيم مئوية:
مثال لمعالجة كل عنصر من عناصر المصفوفة باستخدام صيغة معينة:
عرض مصفوفة من الأرقام باستخدام دالة تأخذ وسيطة:
منقي
الfilter ()
طريقة تخلق مصفوفة جديدة تحتوي على جميع العناصر التي اجتازت الاختبار المحدد في الوظيفة التي تم تمريرها.
دائمًا ما تكون نتيجة المرشح مصفوفة. إذا تم إرجاع دالة لعنصر ما true
(أو أي قيمة "حقيقية") ، يتم تضمين هذا العنصر في النتيجة ، وإلا فلن يتم تضمينه.
بناء الجملة
let newArray = arr.filter(function callback(element[, index, [array]])[, thisArg])
وصف
الfilter()
طريقة استدعاء تمرير callback
تعمل مرة واحدة لكل عنصر موجود في المصفوفة وتقوم ببناء مصفوفة جديدة مع جميع القيم التي من أجلها callback
عادت الوظيفةtrue
أو القيمة التي تصبحtrue
عند الإرسال إلىboolean
. الcallback
يتم استدعاء الوظيفة فقط لمؤشرات المصفوفة التي تم تعيين قيم لها ؛ لا يتم استدعاؤه للفهارس التي تم إسقاطها أو التي لم يتم تعيين قيم لها مطلقًا. يتم ببساطة تخطي عناصر المصفوفة التي لم يتم التحقق منها بواسطة دالة "رد الاتصال" ولا يتم تضمينها في ملف مجموعة جديدة.
الوظيفة⚙️ callback
يسمى بثلاث حجج:
- قيمة العنصر ؛
- مؤشر العنصر ؛
- المصفوفة التي يتم المرور من خلالها.
إذا كانthisArg
تم تمرير المعلمة إلىfilter()
الطريقة ، سيتم استخدامها على أنها this
الطريقة ، سيتم استخدامها على أنهاthis
ستكون القيمةundefined
. في النهاية ، قيمةthis
كما يُرى من دالة يتم تحديدها وفقًا للقواعد المعتادة للتعريفthis
كما رأينا من وظيفة⚙️.
إن "filter()` الطريقة لا تعدل المصفوفة التي تم استدعاؤها.
نطاق العناصر التي تتم معالجتها بواسطة ملف filter()
تم تعيين الطريقة قبل المكالمة الأولى إلى callback
وظيفة. تمت إضافة العناصر إلى المصفوفة بعد بداية ملفfilter()
الطريقة لن يتم زيارتها من قبل callback
وظيفة. إذا تغيرت عناصر الصفيف الموجودة ، فإن القيم التي تم تمريرها إلىcallback
ستكون الوظيفة هي القيم في الوقت الذي يكون فيهfilter()
طريقة زياراتهم. العناصر المحذوفة لن تتم زيارتها.
مثال
تصفية جميع القيم الصغيرة
يستخدم المثال التالي filter()
لإنشاء مصفوفة تمت تصفيتها تحتوي على جميع العناصر أكبر من أو تساويvalue
، وجميع العناصر الأقل منvalue
إزالة.
يقلل
تعمل طريقة التقليل أيضًا في سياق مصفوفة وتستدعي دالة لكل عنصر ، ولكنها أيضًا تجمع نتائج جميع الاستدعاءات في قيمة واحدة. يمكن التحكم في هذا السلوك.
لا يُقصد بتقليل تعديل عناصر مجموعة مثل الخريطة. مهمتها هي حساب "مجموع" جميع العناصر بطريقة أو بأخرى ، وإعادتها.
يمكن أن تكون القيمة الناتجة أي شيء: رقم ، سلسلة ، كائن ، مصفوفة - كل هذا يتوقف على المشكلة التي يحلها مطور JavaScript.
تأخذ طريقة التخفيض معلمتين:
-وظيفة ، مثلmap
, والتي سيتم استدعاؤها بالتسلسل لكل عنصر من عناصر المجموعة ؛
هي القيمة الأولية للمجمع.
تحتوي الوظيفة أيضًا على وسيطتين:
- الأول هو القيمة المتراكمة (المجمع) ؛
- عنصر المصفوفة مباشرة.
بناء الجملة
array.reduce(function callback[, initialValue])
وصف
ينفّذ أسلوب الحد () وظيفة رد النداء مرة واحدة لكل عنصر في المصفوفة ، باستثناء الفراغات ، وأخذ أربع وسيطات: القيمة الأولية (أو القيمة من رد الاتصال السابق) ، وقيمة العنصر الحالي ، والفهرس الحالي ، و مجموعة لتكرار أكثر.
في المرة الأولى التي يتم فيها استدعاء الوظيفة ، يمكن أن تأخذ معلمات المُراكم والقيمة الحالية إحدى القيمتين. إذا كانinitialValue
يتم تمرير الوسيطة في الاستدعاء لتقليل () ، ثم قيمة accumulator
ستكون مساوية لقيمة "initialValue" وقيمة currentValue
ستكون مساوية للقيمة الأولى في المصفوفة. إذا لم يتم تحديد قيمة initialValue ، فسيكون المجمع مساويًا للقيمة الأولى في المصفوفة ، وستكون القيمة الحالية مساوية للقيمة الثانية في المصفوفة.
إذا كانت المصفوفة فارغة ولا initialValue
حجة محددة ، أTypeError
سيتم طرح استثناء. إذا كانت المصفوفة تتكون من عنصر واحد فقط (بغض النظر عن موقعه في المصفوفة) و initialValue
لم يتم تحديد الحجة ، أو إذا كانinitialValue
تم تحديد الوسيطة ، لكن المصفوفة فارغة ، سيتم إرجاع هذه القيمة دون استدعاء الوظيفة⚙️ callback
...
القيمة الأولية للبطارية
دعنا نحسب القيمة الأولية. في المثال يساوي0
, لأننا نحسب القيمة العددية - مجموع الأعمار. بدلاً من الصفر ، يمكن أن يكون هناك أي رقم / سلسلة أخرى (فارغة أو لا) / كائن / مصفوفة - مهما كانت القيمة التي تبدأ في التراكم منها. على سبيل المثال ، دعنا نجمع أسماء جميع الأصدقاء في سطر واحد :
هنا ، كانت القيمة الأولية هي السلسلة " Friends: "
, التي أضيفت إليها أسماء جميع الأصدقاء تدريجياً.
إذا لم تحدد القيمة الأصلية بشكل صريح ، فإن الأول 1️⃣ يصبح عنصر المصفوفة ضمنيًا. في هذه الحالة ، لم يعد يتم استدعاء الوظيفة الخاصة بها.
مثال
جمع كل القيم في المصفوفة:
ونفس الشيء في سطر واحد من التعليمات البرمجية:
تسلسل
تدعم برمجة JavaScript ملفات chaining
نمط - الجمع بين وظائف متعددة في سلسلة واحدة مع الإرسال المتسلسل للنتيجة.
يتم استدعاء جميع التوابع الثلاثة التي تم تحليلها في سياق مصفوفة ، ويعيد اثنان منها 2️⃣ أيضًا مصفوفة. وبالتالي ، من السهل جدًا الجمع بينهما.
على سبيل المثال ، لنحسب العمر الإجمالي لجميع الأولاد :
أو يمكننا جمع أرقام جوازات سفر الفتيات لشراء تذاكر طيران إلى لاس فيغاس :
استنتاج
مع هذه الميزات الرائعة⚙️ الكود يصبح أسهل للقراءة. لذلك ، فيما يلي قائمة بالمقالات التي تتناول المزيد من التفاصيل حول هذا الموضوع.
مشاكل؟
Write to Discord chat.
مشاكل؟
دالة يجب استدعاؤها لكل عنصر من عناصر المصفوفة؟
currentValue
array
callback
طريقة تنشئ مصفوفة جديدة بنتيجة استدعاء الوظيفة المحددة لكل عنصر من عناصر المصفوفة:
map
filter
reduce
يمكن أن تكون القيمة الناتجة لطريقة التخفيض:
- رقم
- صفيف
- أي شيء
يتم جمع كل القيم في المصفوفة بالطريقة التالية:
map
filter
reduce
يتم استخدام المعلمة الاختيارية أو القيمة كملف this
عند استدعاء callback
وظيفة:
array
index
thisArg
طريقة تنشئ مصفوفة جديدة بكل العناصر التي اجتازت التحقق المحدد في الدالة التي تم تمريرها:
map
filter
reduce
الجمع بين عدة وظائف في سلسلة واحدة مع النقل المتسلسل للنتيجة:
- الوحدة
- التسلسل
- الاندماج
لفهم مقدار ما تعلمته في هذا الدرس ، قم بإجراء الاختبار فيmobile application من مدرستنا في هذا الموضوع.
الروابط
- Simplify your JavaScript - use map, reduce and filter
- 15 useful javascript examples of map, reduce and filter
- Array.prototype.map()
- Array.prototype.filter()
- Array.prototype.reduce()
المساهمون✨
الشكر يعود إلى هؤلاء الأشخاص الرائعين (emoji key):
AlisaNasibullina | Dmitriy Vasilev 💵 | Resoner2005 🐛 🎨 🖋 | Navernoss 🖋 🐛 🎨 |