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

يمكنك استخدام القيم الحرفية للكائن لتخزين أزواج المفتاح/القيمة، والمصفوفات لتخزين مجموعات القيم القابلة للتكرار. تقدّم 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

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

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

const myWeakMap = new WeakMap();

myWeakMap;
> WeakMap(0)

يتشابه بنية Weakmap مع "الخريطة"، لكن "الخرائط المجهولة" غير قابلة للتكرار، وتحاول استخدام أي قيمة أخرى غير كائن أو رمز كمفتاح حدوث خطأ في البنية. في حال عدم وجود references لمفتاح خارج 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 هي مجموعة تحتوي فقط على قيم قابلة لجمع البيانات المهملة، مثل المراجع إلى العناصر، أو الرموز التي لم تتم إضافتها إلى سجلّ الرموز العام.

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

const myWeakSet = new WeakSet();

myWeakSet;
> WeakSet []

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

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

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

وبالنظر إلى ما يلي:

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

ماذا يعرض الحقل "myMap

100
"My string"
undefined