في JavaScript، يحتوي الصنف Array على طرق مدمجة قوية كثيرة لتحويل المصفوفات.
تُسهّل هذه الطرق تحويل مصفوفة إلى أخرى بدرجة كبيرة مقارنة باستخدام حلقة for بسيطة أو التعامل المباشر مع المصفوفة.
بعض الطرق نقية، أي أنها لا تعدّل المصفوفة الأصلية، بل تُرجع مصفوفة جديدة بدلًا منها. أما طرق أخرى فتُعدّل المصفوفة التي استُدعيت عليها ولا تُرجع المصفوفة المعدّلة.
فيما يلي بعض الطرق الأكثر شيوعًا في تحويل المصفوفات. وتجد القائمة الكاملة بالطرق المتاحة في توثيق MDN.
map (نقية)أنشئ مصفوفة جديدة بتحويل كل عنصر وفق دالة تُمرَّر كوسيط. وغالبًا ما تُكتب دوال الاستدعاء الراجعة هذه على هيئة دوال سهمية.
let arr = [1, 2, 3, 4];
const newArr = arr.map((value) => value - 1);
console.log(newArr);
// => [0, 1, 2, 3]
console.log(arr);
// => [1, 2, 3, 4]
تجدر الإشارة إلى أن المصفوفة الناتجة ستكون دائمًا بطول المصفوفة الأصلية نفسه.
filter (نقية)تُنشئ مصفوفة بترشيح المصفوفة الحالية، بالاستناد إلى دالة ترشيح (تُرجع صحيحًا إذا وجب الاحتفاظ بالعنصر وخطأً إذا وجب حذفه).
let arr = [1, 2, 3, 4];
arr.filter((value) => value % 2 === 0);
// => [2, 4]
reduce (نقية)تختصر المصفوفة إلى قيمة واحدة باستخدام دالة تأخذ المراكم والعنصر الحالي من المصفوفة كمعاملين. وتوضّح هذه الدالة كيف ينبغي دمج العنصر الحالي في المراكم، وتُرجع المراكم الذي سيُستخدم في التكرار التالي.
let arr = [1, 2, 3, 4];
// Get the sum of elements
arr.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
// => 10
// Classify the numbers by whether they are odd or not
arr.reduce(
(accumulator, currentValue) => {
if (currentValue % 2 === 0) {
accumulator.even.push(currentValue);
} else {
accumulator.odd.push(currentValue);
}
return accumulator;
},
{ even: [], odd: [] },
);
// => { even: [2, 4], odd: [1, 3] }
reverseتعكس ترتيب عناصر المصفوفة.
const arr = [1, 2, 3, 4];
arr.reverse();
// => [4, 3, 2, 1]
تُعدّل هذه الطريقة المصفوفة التي استُدعيت عليها.
slice (نقية)بالنظر إلى فهرس بداية وفهرس نهاية، تُنشئ مصفوفة فرعية من المصفوفة التي تُمرَّر كمعامل.
لن يُضمَّن العنصر الواقع عند فهرس النهاية.
كذلك جميع المعاملات اختيارية:
القيمة الافتراضية لفهرس البداية هي 0، والقيمة الافتراضية لفهرس النهاية هي طول المصفوفة.
const arr = [1, 2, 3, 4];
arr.slice(1, 2); // [2]
arr.slice(1); // [2, 3, 4]
// You can also use negative numbers, that represent the indexes
// starting from the end of the array
arr.slice(-2); // [3, 4]
spliceتحذف عناصر المصفوفة أو تستبدلها و/أو تضيف عناصر جديدة إليها.
وتأخذ المعاملات التالية:
وتُرجع splice العناصر التي حُذفت.
const arr = ['1', '2', '5', '6'];
// Insert an element at index 2
arr.splice(2, 0, '3');
console.log(arr);
// => ['1', '2', '3', '5', '6']
// Remove 2 elements, starting at index 3 and insert 2 elements
const removed = arr.splice(3, 2, '4', '5');
console.log(removed);
// => ['5', '6']
console.log(arr);
// => ['1', '2', '3', '4', '5']
// Remove 1 element at index 1
arr.splice(1, 1);
console.log(arr);
// => ['1', '3', '4', '5']
sortافتراضيًا، تُرتّب sort عناصر المصفوفة بتحويلها أولًا إلى سلاسل نصية ثم بإجراء مقارنة بين السلاسل النصية (انظر مقارنة المفاهيم).
ويحدث الترتيب في المكان نفسه، ما يعني أن المصفوفة الأصلية تُعدَّل.
كما تُرجع sort المصفوفة المعدّلة، وهو أمر مفيد إذا أردت ربط طرق أخرى بها.
const arr = ['c', 'a', 'z', 'b'];
const result = arr.sort();
console.log(result);
// => ['a', 'b', 'c', 'z']
console.log(arr);
// => ['a', 'b', 'c', 'z']
لتخصيص سلوك الترتيب، يمكنك تمرير دالة مقارنة كوسيط. تُستدعى دالة المقارنة نفسها بوسيطين هما عنصران من المصفوفة، ثم يجب أن تُرجع ما يلي:
0 إذا كان ينبغي أن يبقى ترتيب العناصر على حالهوفيما يلي مثال على استخدام دالة مقارنة مخصصة لترتيب مصفوفة من الكائنات.
const arr = [
{ name: 'Lydia', age: 7 },
{ name: 'Anne', age: 34 },
{ name: 'Holger', age: 59 },
];
arr.sort((item1, item2) => {
if (item1.name < item2.name) {
return -1;
}
if (item1.name > item2.name) {
return 1;
}
return 0;
});
// => [ { name: 'Anne', age: 34 }, { name: 'Holger', age: 59 },
// { name: 'Lydia', age: 7 } ]
إليز، الساحرة الصاعدة، تواصل تدريبها. ستُمنح مجموعة بطاقات وستحاول تحويل تلك المجموعة. ستجعل بطاقات معينة تظهر أو تختفي أو تغيّر قيمها، أو تُعيد ترتيب نفسها بالكامل. ولتسهيل الأمور، فإنها عادةً ما تبدأ ببطاقات مرقّمة من 1 إلى 10 فقط، مع أن بعض الحِيَل قد ينتج عنها بطاقات أكبر.
تريد إليز مضاعفة رقم كل بطاقة في المجموعة. وقد ينتج عن ذلك بطاقات أعلى من 1-10.
const deck = [1, 2, 3, 4, 10];
seeingDouble(deck);
// => [2, 4, 6, 8, 20]
تريد إليز أن تُثلّث كل بطاقة 3 موجودة في المجموعة. فإذا بدأت المجموعة ببطاقة 3 واحدة، فبعد الحيلة ستحتوي على ثلاث بطاقات 3 مكان البطاقة الأصلية.
const deck = [1, 3, 9, 3, 7];
threeOfEachThree(deck);
// => [1, 3, 3, 3, 9, 3, 3, 3, 7]
ستأخذ إليز مجموعة من عشر بطاقات، وتجعل كل بطاقة تختفي ما عدا البطاقتين في المنتصف.
const deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
middleTwo(deck);
// => [5, 6]
تريد إليز نقل بطاقتي أعلى المجموعة وأسفلها إلى المنتصف، بترتيب معكوس.
يمكنك افتراض أن عدد بطاقات المجموعة زوجي.
const deck = [1, 2, 3, 5, 6, 10];
sandwichTrick(deck);
// => [2, 3, 10, 1, 5, 6]
رقم إليز المفضل اليوم هو 2. في هذه الحيلة، ستختفي من المجموعة كل بطاقة ليست 2.
const deck = [1, 2, 3, 4, 10, 2];
twoIsSpecial(deck);
// => [2, 2]
تريد إليز أن تُظهر براعتها في إعادة ترتيب البطاقات بشكل مثالي، مهما كانت مخلوطة جيدًا.
const deck = [10, 1, 5, 3, 2, 8, 7];
perfectlyOrdered(deck);
// => [1, 2, 3, 5, 7, 8, 10]
تريد إليز تغيير ترتيب البطاقات في المجموعة. بعد الحيلة، يجب أن تنتقل البطاقة الموجودة في الأعلى حاليًا إلى أسفل المجموعة. أما البطاقة الثانية فيجب أن تصبح قبل الأخيرة، وهكذا.
const deck = [10, 1, 5, 3, 2];
reorder(deck);
// => [2, 3, 5, 1, 10]
سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.