٢٥ مارس ٢٠٢١

النوع Map (الخرائط) والنوع Set (الأطقم)

Till now, we’ve learned about the following complex data structures:

  • Objects are used for storing keyed collections.
  • Arrays are used for storing ordered collections.

ولكن في الحياة الواقعية، هذا لا يكفي. ولهذا تقدّم لك اللغة نوعيين آخرين: الخارطة Map والطقم Set.

الخارطة Map

تُعدّ الخارطة تجميعة ذات مفاتيح من عناصر البيانات، تمامًا مثل الكائنات Object، مع فرق بسيط، هو أنّ الخارطة Map تتيح استعمال المفاتيح مهمًا كان نوعها.

هذه توابِعها وخاصياتها:

  • new Map()‎ – يُنشِئ خارطة.
  • map.set(key, value)‎ – يضبط القيمة حسب مفتاحها.
  • map.get(key)‎ – يجلب القيمة حسب مفتاحها، وundefined لو لم يوجد key في الخارطة.
  • map.has(key)‎ – يُعيد true لو كان key موجودًا، وإلا فَـ false.
  • map.delete(key)‎ – يُزيل القيمة حسب مفتاحها.
  • map.clear()‎ – يُزيل كل شيء من الخارطة.
  • map.size – يُعيد عدد العناصر الحالي.

إليك المثال الآتي:

let map = new Map();

map.set('1', 'str1');   // المفتاح سلسلة نصية
map.set(1, 'num1');     // المفتاح عدد
map.set(true, 'bool1'); // المفتاح قيمة منطقية

// أتذكر كيف أنّ الكائن العادي يُحوّل المفاتيح لأي سلاسل نصية؟
// ‫الخارطة هنا تحترم النوع، وهذان السطران مختلفان:
alert( map.get(1)   ); // 'num1'
alert( map.get('1') ); // 'str1'

alert( map.size ); // 3

As we can see, unlike objects, keys are not converted to strings. Any type of key is possible.

map[key]isn’t the right way to use aMap

So we should use map methods: set, get and so on.

يمكن أن تستعمل الخارطة الكائناتَ نفسها مفاتيح.

مثال:

let john = { name: "John" };

// لنخزّن عدد زيارات كل زائر لنا
let visitsCountMap = new Map();

// ‫كائن john هو مفتاح الخارطة
visitsCountMap.set(john, 123);

alert( visitsCountMap.get(john) ); // 123

Using objects as keys is one of the most notable and important Map features. The same does not count for Object. String as a key in Object is fine, but we can’t use another Object as a key in Object.

let john = { name: "John" };
let ben = { name: "Ben" };

let visitsCountObj = {}; // نحاول استعمال كائن

visitsCountObj[ben] = 234; // try to use ben object as the key
visitsCountObj[john] = 123; // try to use john object as the key, ben object will get replaced

_!_
// That's what got written!
alert( visitsCountObj["[object Object]"] ); // 123
_/!_

المتغيّر visitsCountObj من نوع ”كائن“، ولهذا يحوّل كلّ المفاتيح (مثل john