تصفية, خريطة وتقليل العمليات


أداء ، تطوير سريع وعملي للكود مع عمليات تصفية وخريطة وتقليل


دعونا نفهم هذه العمليات من خلال إعطاء مثال على صنع البيتزا

لعمل بيتزا ، نحتاج إلى استخدام العديد من المكونات. حسنًا ، ما المواد التي سنستخدمها ، تقوم وظيفة المصفوفة arrayFilter بهذا ، أي أنها تستخرج ما نحتاجه من جميع البيانات التي لدينا. لذلك ، نحتاج إلى وظيفة التصفية للعثور على الدقيق والملح والزيت وصلصة الطماطم والجبن والثوم والبصل والأوريغانو والخميرة التي سنستخدمها في البيتزا. الآن لدينا المواد. فهل نضعها في الفرن وننتظرها حتى تنضج؟ لا ، نحن بالتأكيد بحاجة إلى تحضير الدقيق وتقطيع الطماطم والثوم والجبن والبصل. لهذا ، نحتاج إلى استخدام وظيفة خريطة المصفوفة. تتيح لنا عملية الخريطة تحويل البيانات إلى نوع أو نتيجة أخرى من خلال معالجتها. بمعنى آخر ، تنتمي عمليات مثل تقطيع البصل إلى وظيفة الخريطة. إذا اعتبرنا ذلك بمثابة بيانات ، فيمكننا القول إن مبلغ ضريبة القيمة المضافة الذي سنجده نتيجة مضاعفة معدل ضريبة القيمة المضافة بالمبلغ الصافي. في الواقع ، مبلغ ضريبة القيمة المضافة هو نتيجة وليس قيمة. أو البيانات التي تتم معالجتها في صفوف مثل صافي مجموع الصف يجب معالجتها باستخدام الخريطة. نعم ، لقد قمنا الآن بمعالجة ما سيتم معالجته من موادنا ، لذلك قمنا بتقطيع البصل والطماطم والثوم. حان الوقت الآن لجزء الطهي. التخفيض هو الشيء الرئيسي الذي يجب الانتباه إليه هنا. لأن نتيجة عملية التصغير لم تعد تصل إلى أي من النتائج الأصلية. بعبارة أخرى ، عندما نصنع بيتزا ، لم نعد نسميها مصنوعة من الجبن والبصل والثوم ، نسميها بيتزا مباشرة. ينتج Reduce نتيجة مفردة في سلسلة بيانات. على سبيل المثال ، يمكننا أن نقول مجموع سطور الفاتورة. في بعض الأحيان ، يمكنه أيضًا القيام بتجميع ، على سبيل المثال ، الإجماليات وفقًا لمعدلات ضريبة القيمة المضافة. هنا ، حتى إذا كان هناك أكثر من بيانات نتيجة التجميع ، فلا يمكن العودة إلى البيانات الرئيسية ، ونتيجة لذلك ، تم إنشاء بيانات جديدة. 

معلومات أولية للوظائف التي تبدأ بالقائمة والمصفوفة

إذا رأيت دوال قائمة ومصفوفة مسبوقة بنفس الوظيفة postfix ، فاختر تلك التي تبدأ بالمصفوفة. على سبيل المثال ، تقوم وظائف arrayFilter و listFilter بتصفية المصفوفات والقوائم. لكن القائمة هي في الواقع مصفوفة افتراضية. في كل مرة ، يتم تحويل القائمة إلى مصفوفة ، ثم يتم تحويل القائمة مرة أخرى. لهذا السبب ، حتى إذا تم استخدام النتيجة كقائمة ، فيجب تنفيذها على المصفوفة ، وإذا كانت القيمة الأولية قائمة ، فيجب تحويلها مرة أخرى إلى القائمة بعد اكتمال جميع العمليات عن طريق التحويل إلى مصفوفة باستخدام listToArray. من الضروري تحويل القوائم إلى مصفوفات في كل مرة ومنع تحويل القوائم مرة أخرى. لذلك ، سيتم شرح موضوعنا من خلال وظائف ذات بادئات مصفوفة.

arrayFilter(array, function(element [,index [,array]])) array

توفر دالة التصفية المعالجة عن طريق إرسال جميع العناصر في المصفوفة إلى الدالة المعطاة في المتغير الثاني واحد تلو الأخر. يتم تمرير عناصر المصفوفة إلى الدلة عبر متغير العنصر ، ورقم التسلسل في الفهرس والفهرس الرئيسي فوق متغير المصفوفة. يجب تحديد متغير العنصر على الأقل في الدالة المراد كتابتها ، ولا يلزم تحديد المتغيرات الأخرى.

يقوم بشكل عام بإجراء التصفية عن طريق تصفية العناصر في المصفوفة. على سبيل المثال ، تقوم بعملية البحث عن فواتير باسم العميل "Halit". لهذا ، إذا أردنا تحديد السجلات مع حقل العميل "Halit" من مصفوفة تسمى الفواتير ، فيمكننا استخدامها على النحو التالي.

وتجدر الإشارة إلى أن جميع الوظائف التي تُرجع نتيجة منطقية يمكن أن تعمل مع هذه العملية. بمعنى آخر ، يتم استخدامه في عمليات أكثر تعقيدًا مثل تلك التي تتم معالجتها في كتلة الوظيفة وتتجاوز النتيجة قيمة معينة. ومع ذلك ، فإن النقطة التي يجب ألا ننسىها هي أنه إذا كان من الممكن استخدام القيمة التي سيتم حسابها والتحكم فيها في المرشح لاحقًا ، فسيكون من المناسب أولاً حساب البيانات عن طريق التعيين ثم تقليلها إلى مستوى التصفية البسيط. ولكن إذا تمت تصفية نتيجة الحساب فقط ، فقد يعني إنشاء خريطة إنشاء بيانات إضافية. أود أن ألفت انتباهكم إلى حقيقة أننا لم نعد استخدام الفهرس والمصفوفة الرئيسية في هذا المثال.

arrayMap(array, function(element [,index [,array]])) array

ترسل الدالة Map جميع العناصر الموجودة في الصفيف واحدة تلو الأخرى إلى الدالة الواردة في المعلمة الثانية لإنشاء قيمة جديدة. يتم تمرير عناصر الصفيف إلى الدالة من خلال متغير العنصر ورقم التسلسل على الفهرس والفهرس الرئيسي من خلال متغير الصفيف. على الأقل يجب تحديد متغير العنصر في الدالة المراد كتابتها ، ولا يلزم تحديد المتغيرات الأخرى. تتم إضافة القيمة الجديدة التي تم إنشاؤها هنا إلى تسلسل النتائج بنفس الفهرس. يمكن أن يكون العنصر المراد إضافته متغيرا جديدا أو إصدارا معدلا من المتغير الموجود.

وعادة ما يتم استخدامه للمعاملات التي يتم حسابها ويتم تحقيق النتيجة. كما في المثال الذي قدمته سابقا ، يمكننا استخدامه في عمليات مثل إيجاد مبلغ ضريبة القيمة المضافة عن طريق ضرب إجمالي الخط في معدل ضريبة القيمة المضافة. على سبيل المثال، ليكن لدينا الحقول الإجمالية وضريبة القيمة المضافة في سلسلة ونحسب الحقل kdv_tutari ونضيفه إلى هذا السطر.

في هذا المثال ، يتم حساب حقل vat_amount لكل عنصر في مصفوفة عدد_الفاتورة ، مضافًا إلى البنية الحالية ، ويتم تحويل البنية الحالية والمضافة كقيمة جديدة. يتم نقل النتيجة إلى نفس المتغير ، ويتم ذلك لأنه يتم تعديل نفس المتغير (أي القيم الموجودة ليست تالفة). من المعقول أن تفعل ذلك بهذه الطريقة. ومع ذلك ، إذا كنت تقوم بعملية تجعل العناصر في المصفوفة مختلفة عن العناصر القديمة ، فقد يكون تخصيصها لمتغير المصفوفة القديم خطوة خاطئة. على سبيل المثال ، يمكنك تحويل القيم في TL في المصفوفة لدينا إلى USD وتحويلها إلى مصفوفة جديدة.

arrayReduce(array, function(result, element [, index [, array]]) [,initial_value]) any

ترسل دالة التصغير كل عنصر في المصفوفة إلى الدالة ، وتقوم بتعيينه إلى القيمة الناتجة وإرجاع قيمة النتيجة كنتيجة. على الرغم من أن هذه العملية مربكة بعض الشيء ، يمكننا في الواقع مقارنة نتيجة كل صف بقيمة النتيجة واستدعاء الوظيفة مرة أخرى بقيمة النتيجة النهائية. 

غالبًا ما يتم استخدامه في عمليات مثل المجاميع الفرعية أو المجاميع بالتجميع. على سبيل المثال ، لنجد مجموع الفاتورة وإجماليات ضريبة القيمة المضافة وفقًا لمعدل ضريبة القيمة المضافة.

في هذا المثال ، يتم تلخيص كل من مجاميع المنطق العادي ومنطق التجميع. بينما تم الوصول إلى النتيجة النهائية عن طريق إضافة قيمة النتيجة في كل مرة في المجموع الثابت ، تم إنشاء بنية أخرى وإرجاعها في العملية التي تم إجراؤها عن طريق التجميع. النقطة التي يجب أخذها في الاعتبار هنا هي تعيين قيمة النتيجة بالقيمة الأولية قبل بدء العمليات ، لأن القيمة الأولية لا تعمل دائمًا بشكل ثابت.

Pipe operations

يستخدم هذا المفهوم للعمليات التي تحاول الحصول على نتائج من خلال العمل بالتتابع والمتداخلة معًا. على سبيل المثال ، لنأخذ إجمالي مبلغ ضريبة القيمة المضافة للأسطر دون الترقيات في سطور الفاتورة.

يمكنك استدعاء خريطة التصفية وتقليل العملية إلى ما لا نهاية اعتمادًا على الحاجة المتداخلة ، والتصفية والحساب وإعادة التصفية وفقًا للحقل المحسوب ، وإنشاء نتيجة مجمعة ، وحسابها ، وتصفية هذه النتيجة وتحويلها إلى نتيجة مرة أخرى. بمعنى آخر ، يمكنك إنشاء الرموز بسرعة كما تريد باستخدام هذا الثلاثي المتداخل. بالطبع ، ليس عليك استخدام الثلاثة ، يمكنك فقط تلبية احتياجاتك في عملية ثنائية مثل التصفية والخريطة ، أو يمكنك أخذ بيانات هرمية مثل الخريطة وتقليلها إلى مستويات أعلى عن طريق الحساب.

النهج المناسب

يمكنك القول أنه يمكننا حساب هذه العمليات ، على سبيل المثال ، أثناء إجراء عمليات الحلقة في الجداول ، أي أثناء طباعة الحقول على الشاشة. ومع ذلك ، فإن النقطة المهمة هي فصل النموذج عن العرض عن بعضهما البعض.

الغرض من الوظائف الثلاث المهمة التي قدمتها في هذا الموضوع والوظائف الأخرى التي لم أقدمها هو تشكيل النموذج. بعبارة أخرى ، سيفهم مطورو البرامج الآخرون بوضوح عمليات الأنابيب التي ستقوم بها على النموذج والحسابات التي تجريها في البرنامج الذي تم تطويره في المجتمع وستكون النتائج على مستوى النموذج ، وسيعرفون أنه لا يوجد إجمالي المعاملات المخفية بين HTML والرموز الأخرى. إذا كان بإمكانك إنهاء العملية قبل الإخراج ، فعند إضافة ميزة جديدة ، يمكنك إما فتح عقدة أخرى على pipe أو تعيين القيم الضرورية لمتغير جديد. من الصعب فهم العمليات في عملية الحلقة التقليدية ، والتي تسمى )المتغير السباغيتي )، وهي مليئة بالحسابات التي تم التغاضي عنها أو الرموز المحفوفة بالمخاطر والتي يصعب الوصول إليها. يتوقع أسلوب الكود النظيف أن النموذج ورموز العرض يجب أن يتم تجميعهما قدر الإمكان ، وعزلهما عن بعضهما البعض ، حتى لو كانا في نفس الملف. بالإضافة إلى ذلك ، تعمل هذه الوظائف مرة أخرى على تقليل الكود وإزالة حشد المتغيرات الوسيطة التي ستحدث في عملية )المتغير السباغيتي )،. سأشرح بالتفصيل هذه الوظائف ، والتي يمكنها التغلب على بعض القيود في مفهوم الاستعلام عن الاستعلام ويمكن أن تعمل جنبًا إلى جنب مع الاستعلام عن الاستعلام ، في مقالي الذي سيتم نشره لاحقًا.


?

?