المجموعات المرتبطة بمفاتيح

يمكنك استخدام القيم الحرفية للكائن لتخزين أزواج المفتاح/القيمة والمصفوفات لتخزين مجموعات القيم القابلة للتكرار. تقدّم منصّة ES6 أيضًا هياكل بيانات متخصّصة لتناسب حالات الاستخدام الأكثر دقة: تعيين لأزواج المفتاح/القيمة، وتعيين من أجل القيم الفردية.

خريطة

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

لإنشاء خريطة، استخدم الدالة الإنشائية Map():

const myMap = new Map();

myMap;
> Map(0)

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

const myMap = new Map([
    [ "myKey", "A string value" ],
    [ "mySecondKey", 500 ],
    [ "myThirdKey", true ]
]);

myMap;
> Map(3) {'myKey' => 'A string value', 'mySecondKey' => 500, 'myThirdKey' => true}

مرة أخرى، يختلف كائن الخريطة عن الكائن الحرفي في أن القيمتين معًا والمفاتيح يمكن أن تأخذ أي نوع بيانات وقيم:

const notAFunction = () => console.log( "function" );
const myMap = new Map([
  [ null, 0 ],
  [ false, "This is false" ],
  [ undefined, "No defined value" ],
  [ NaN, "Not a number" ]
]);

myMap;
> Map(4) {null => 0, false => 'This is false', undefined => 'No defined value', NaN => 'Not a number'}

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

const myMap = new Map();

myMap;
> Map(0)

myMap.set( "myKey", "My value." );

myMap.has( "myKey" );
> true

myMap.get( "myKey" );
"My value."

myMap.delete( "myKey" );

myMap;
> Map(0)

تكون المفاتيح في الخريطة فريدة من نوعها، مما يعني أن تعيين مفتاح متطابق يؤدي إلى استبدال زوج المفتاح/القيمة المخزن مسبقًا:

const myMap = new Map([ [ "myKey", "A string value" ] ]);

myMap.set( "myKey", 500 );

myMap;
> Map(1) {'myKey' => 500}

كما هو الحال مع العناصر، يمكنك تعيين خريطة لمتغيّر تم تعريفه باستخدام const ثم تعديل تلك الخريطة. ومع ذلك، كما هو الحال مع حالات الاستخدام الأخرى لـ const، لا يمكنك تغيير المتغير نفسه أو حذفه:

const myMap = new Map();
myMap.set( "myKey", "A string value" );

myMap;
> Map(1) {'myKey' => 500}

WeakMap

خريطة WeakMap هي خريطة تحمل الحالة "ضعيفة" المراجع التي يجب أن تشير إلى كائنات أو رموز التي لم تتم إضافتها إلى سجلّ Symbol العالمي.

لإنشاء خريطة ضعيفة، استخدِم الدالة الإنشائية WeakMap():

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

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

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

تعيين

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

لإنشاء مجموعة، استخدم الدالة الإنشائية Set():

const mySet = new Set();

mySet;
> Set []

يمكنك أيضًا إنشاء مجموعة من قيمة حرفية في مصفوفة:

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

نظرًا لأن المجموعة لا تسمح بعناصر مكررة، فعند إنشاء مجموعة من التي تحتوي على مثيلات متعددة من نفس القيمة، فإنها تحتفظ بأول مثيل لتلك القيمة:

const mySet = new Set([ 1, 2, 3, 2 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

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

const mySet = new Set();

mySet.add( "My value." );

mySet;
> Set [ "My value." ]

mySet.has( "My value." );
> true

mySet.delete( "My value." );

mySet;
> Set []

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

const mySet = new Set([ 1, 2, 3 ]);

mySet;
> Set(3) [ 1, 2, 3 ]

mySet.add( 2 );
> Set(3) [ 1, 2, 3 ]

لإنشاء مصفوفة من مجموعة، استخدِم طريقة Array.from() أو طريقة التوزيع. بناء الجملة:

const mySet = new Set([ 1, 2, 3 ]);
const myArray = Array.from( mySet );

myArray;
> Array(3) [ 1, 2, 3 ]

[ ...mySet ];
> Array(3) [ 1, 2, 3 ]

WeakSet

WeakSet هي مجموعة تتضمن فقط قيمًا قابلة لجمع البيانات غير الصالحة، مثل الإشارات إلى الكائنات أو الرموز التي لم تتم إضافتها إلى سجلّ Symbol العالمي.

لإنشاء مجموعة WeakSet، استخدم الدالة الإنشائية WeakSet():

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

بناء جملة WeakSet مشابه لـ Set، على الرغم من أن WeakSet ليس قابلة للتكرار، ومحاولة إضافة أي قيمة بخلاف الكائن أو الرمز تتسبب في حدوث خطأ في البنية. كما هو الحال مع WeakMap، عندما لا توجد مراجع أخرى وجود قيمة مُشار إليها من خلال WeakSet، تصبح هذه القيمة مؤهَّلة تجميع البيانات المهملة.

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

التحقق من فهمك

استنادًا إلى ما يلي:

        const myMap = new Map([ [ "myKey", "My string" ] ]);
        myMap.set( "myKey", 100 );
      

ماذا يعرض myMap؟

100
"My string"
undefined