1. الخطوات الأولى
2. الجمع بين الوظائف
3. الاستخدام الجزئي (الكاري)
4. برمجة تعريفية
5. تدوين أساسي
6. الثبات والأشياء
7. الثبات والمصفوفات
8. العدسات
9. الخلاصة
هذا المنشور هو الجزء السابع من سلسلة مقالات برمجة وظيفية بعنوان Ramda Style Thinking.
في الجزء السادس ، تحدثنا عن العمل مع كائنات JavaScript بأسلوب وظيفي وثابت.
في هذا المنشور سنتحدث عن عمل مماثل مع المصفوفات.
قراءة عناصر المصفوفة
في الجزء السادس ، تعلمنا عن وظائف رامدا المختلفة لقراءة خصائص الأشياء ، مثل prop
، pick
has
. لدى Ramda طرق أكثر لقراءة عناصر المصفوفة.
مكافئ prop
لصفيف هو nth ؛ مكافئ pick
هو شريحة ، والمعادل has
يحتوي على . دعونا نلقي نظرة عليها.
const numbers = [10, 20, 30, 40, 50, 60] nth(3, numbers) // => 40 ( ) nth(-2, numbers) // => 50 ( ) slice(2, 5, numbers) // => [30, 40, 50] (. ) contains(20, numbers) // => true
تأخذ Slice فهرسين وترجع صفيفًا فرعيًا يبدأ من الفهرس الأول (بدءًا من الصفر) ويتضمن جميع العناصر حتى الفهرس الثاني ، ولكن لا يشمل عنصر هذا الفهرس.
يعد الوصول إلى العناصر الأولى والأخيرة من المصفوفة أمرًا شائعًا جدًا ، لذلك يوفر Ramda وظائف قصيرة لهذه الحالات ، الرأس والأخير . كما يوفر وظائف للحصول على جميع العناصر باستثناء العنصر الأول ( الذيل ) ، وكلها ما عدا العنصر الأخير ( init ) ، والعناصر N الأولى ( تأخذ (N) ) ، والعناصر N الأخيرة ( takeLast (N) ). دعونا نلقي نظرة عليها في العمل.
const numbers = [10, 20, 30, 40, 50, 60] head(numbers) // => 10 tail(numbers) // => [20, 30, 40, 50, 60] last(numbers) // => 60 init(numbers) // => [10, 20, 30, 40, 50] take(3, numbers) // => [10, 20, 30] takeLast(3, numbers) // => [40, 50, 60]
إضافة عناصر الصفيف وتحديثها وحذفها
من خلال دراسة كيفية العمل مع الكائنات ، تعلمنا عن الوظائف dissoc
و dissoc
و dissoc
لإضافة وتحديث وحذف الخصائص.
نظرًا لأن المصفوفات تحتوي على بنية بيانات مرتبة ، فلدينا العديد من الطرق التي تؤدي نفس الوظيفة مثل assoc
للكائنات. الأكثر شيوعًا هي الإدراج والتحديث ، ولكن يوفر Ramda أيضًا طرق الإلحاق واللاحقة للحالات النموذجية لإضافة عناصر إلى بداية ونهاية المصفوفة. insert
، append
، وقبل إضافة عناصر جديدة إلى الصفيف ؛ update
"يستبدل" عنصر معين في الصفيف بقيمة جديدة.
كما يمكنك أن تتوقع من مكتبة وظيفية ، ترجع كل هذه الوظائف صفيفًا جديدًا مع التغييرات المتوقعة ؛ الصفيف الأصلي لا يتغير أبداً.
const numbers = [10, 20, 30, 40, 50, 60] insert(3, 35, numbers) // => [10, 20, 30, 35, 40, 50, 60] append(70, numbers) // => [10, 20, 30, 40, 50, 60, 70] prepend(0, numbers) // => [0, 10, 20, 30, 40, 50, 60] update(1, 15, numbers) // => [10, 15, 30, 40, 50, 60]
لدمج كائنين في واحد ، تعلمنا سابقًا عن طريقة merge
. يوفر Ramda أيضًا طريقة concat لإجراء نفس العملية مع المصفوفات.
const numbers = [10, 20, 30, 40, 50, 60] concat(numbers, [70, 80, 90]) // => [10, 20, 30, 40, 50, 60, 70, 80, 90]
لاحظ أن الصفيف الثاني قد انضم إلى الأول. يبدو هذا منطقيًا عند استخدام هذه الطريقة بشكل منفصل عن التعليمات البرمجية الأخرى ، ولكن ، مثل merge
، قد لا يؤدي هذا المنطق تمامًا إلى ما نتوقعه إذا استخدمنا هذه الطريقة في خط الأنابيب الخاص بنا. لقد وجدت أنه من المفيد كتابة دالة مساعدة ، concatAfter
: const concatAfter = flip(concat)
، لاستخدامها في خطوط الأنابيب الخاصة بي.
يوفر Ramda أيضًا العديد من الخيارات لحذف العناصر. إزالة يزيل العناصر حسب الفهرس الخاص بهم ، بينما بدون يزيلها حسب قيمتها. هناك أيضًا طرق مثل drop و dropLast للحالات النموذجية عندما نزيل عناصر من بداية أو نهاية مصفوفة.
const numbers = [10, 20, 30, 40, 50, 60] remove(2, 3, numbers) // => [10, 20, 60] without([30, 40, 50], numbers) // => [10, 20, 60] drop(3, numbers) // => [40, 50, 60] dropLast(3, numbers) // => [10, 20, 30]
لاحظ أن remove
تقبل فهرسًا وكمية ، بينما تقبل slice
مؤشرين. يمكن أن يكون هذا التناقض مربكًا إذا كنت لا تعرف عنه.
تحويل العنصر
كما هو الحال مع الكائنات ، قد نرغب في تحديث عنصر الصفيف بتطبيق الوظيفة على القيمة الأصلية.
const numbers = [10, 20, 30, 40, 50, 60] // 10 update(2, multiply(10, nth(2, numbers)), numbers) // => [10, 20, 300, 40, 50, 60]
لتبسيط هذه الحالة النموذجية ، يوفر Ramda طريقة ضبط تعمل مثل evolve
للكائنات. ولكن على عكس evolve
، فإن adjust
يعمل مع عنصر واحد فقط من الصفيف.
const numbers = [10, 20, 30, 40, 50, 60] // 10 adjust(multiply(10), 2, numbers)
لاحظ أن الوسيطتين الأوليين adjust
تتعارضان عند مقارنتهما update
. قد يكون هذا مصدرًا للأخطاء ، ولكن من المنطقي أن تفكر في تطبيق جزئي. قد ترغب في إجراء adjust(multiply(10))
لنفسك ثم تحديد فهرس الصفيف الذي تريد تغييره باستخدامه.
الخلاصة
الآن لدينا أدوات للعمل مع المصفوفات والكائنات بأسلوب تعريفي وثابت. هذا يسمح لنا ببناء برامج تتكون من كتل بناء صغيرة وظيفية ، تجمع بين الوظائف التي ستفعل ما نحتاجه ، وكل هذا دون تغيير جميع هياكل البيانات لدينا.
التالي
لقد تعلمنا كيفية قراءة وتحديث وتحويل خصائص العناصر وعناصر المصفوفات. يوفر Ramda أدوات أساسية أخرى لإجراء هذه العمليات ، العدسات. ستوضح لنا مقالة العدسة التالية كيفية عملها.