كائنات جافا سكريبت ، الأقواس المربعة والخوارزميات

أحد أقوى جوانب JavaScript هو القدرة على الإشارة ديناميكيًا إلى خصائص الكائنات. في هذه المقالة سنلقي نظرة على كيفية عمل ذلك والمزايا التي قد يمنحها لنا ذلك. سنلقي نظرة سريعة على بعض هياكل البيانات المستخدمة في علوم الكمبيوتر. بالإضافة إلى ذلك ، سننظر في شيء يسمى تدوين Big O والذي يستخدم لوصف أداء الخوارزمية.

مقدمة الكائنات

لنبدأ بإنشاء كائن بسيط يمثل سيارة. كل كائن لديه شيء يسمى properties. الخاصية هي متغير ينتمي إلى كائن. وهدفنا السيارات لديها ثلاث خصائص: make، modelو color.

دعونا نرى كيف يمكن أن تبدو:

const car = { make: 'Ford', model: 'Fiesta', color: 'Red'};

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

يمكننا حتى إخراجها باستخدام console.log:

console.log(car.color); //outputs: Red

هناك طريقة أخرى للإشارة إلى خاصية وهي استخدام تدوين الأقواس المربعة:

console.log(car['color']); //outputs: Red

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

بمعنى ، بدلاً من تشفير اسم خاصية معين ، يمكننا تحديده كسلسلة في متغير:

const propertyName = 'color';const console.log(car[propertyName]); //outputs: Red

استخدام البحث الديناميكي مع تدوين الأقواس المربعة

لنلق نظرة على مثال يمكننا استخدام هذا فيه. لنفترض أننا ندير مطعمًا ونريد أن نكون قادرين على الحصول على أسعار العناصر في قائمتنا. طريقة واحدة للقيام بذلك هي استخدام if/elseالبيانات.

دعنا نكتب وظيفة تقبل اسم العنصر وإرجاع السعر:

function getPrice(itemName){ if(itemName === 'burger') { return 10; } else if(itemName === 'fries') { return 3; } else if(itemName === 'coleslaw') { return 4; } else if(itemName === 'coke') { return 2; } else if(itemName === 'beer') { return 5; }}

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

النهج الأفضل هو فصل بياناتنا عن منطقنا. ستحتوي البيانات على قائمتنا وسيبحث المنطق عن الأسعار من تلك القائمة.

يمكننا تمثيل menuالكائن ككائن حيث يتوافق اسم الخاصية ، المعروف أيضًا باسم المفتاح ، مع قيمة.

في هذه الحالة سيكون المفتاح هو اسم العنصر والقيمة ستكون سعر العنصر:

const menu = { burger: 10, fries: 3, coleslaw: 4, coke: 2, beer: 5};

باستخدام رمز الأقواس المربعة ، يمكننا إنشاء دالة تقبل وسيطين:

  • كائن قائمة
  • سلسلة مع اسم العنصر

وإرجاع سعر هذا العنصر:

const menu = { burger: 10, fries: 3, coleslaw: 4, coke: 2, beer: 5};
function getPrice(itemName, menu){ const itemPrice = menu[itemName]; return itemPrice;}
const priceOfBurger = getPrice('burger', menu);console.log(priceOfBurger); // outputs: 10

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

هياكل البيانات والخوارزميات

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

لنلقِ نظرة على مثال عن سبب رغبتنا في استخدام الخريطة. لنفترض أننا ندير متجر كتب ولدينا قائمة بالكتب. يحتوي كل كتاب على معرف فريد يسمى رقم الكتاب القياسي الدولي (ISBN) ، وهو رقم مكون من 13 رقمًا. نقوم بتخزين كتبنا في مصفوفة ونريد التمكن من البحث عنها باستخدام رقم ISBN.

إحدى طرق القيام بذلك هي عن طريق التكرار فوق المصفوفة ، والتحقق من قيمة ISBN لكل كتاب وما إذا كانت تتطابق مع إعادته:

const books = [{ isbn: '978-0099540946', author: 'Mikhail Bulgakov', title: 'Master and Margarita'}, { isbn: '978-0596517748', author: 'Douglas Crockford', title: 'JavaScript: The Good Parts'}, { isbn: '978-1593275846', author: 'Marijn Haverbeke', title: 'Eloquent JavaScript'}];
function getBookByIsbn(isbn, books){ for(let i = 0; i < books.length; i++){ if(books[i].isbn === isbn) { return books[i]; } }}
const myBook = getBookByIsbn('978-1593275846', books);

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

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

دعنا نلقي نظرة على كيفية جعل الخوارزمية أكثر كفاءة باستخدام بنية بيانات مختلفة.

كما تمت مناقشته ، يمكن استخدام الخريطة للبحث عن القيمة التي تتوافق مع المفتاح. يمكننا هيكلة بياناتنا كخريطة بدلاً من مصفوفة باستخدام كائن.

سيكون المفتاح هو رقم ISBN وستكون القيمة هي كائن الكتاب المقابل:

const books = { '978-0099540946':{ isbn: '978-0099540946', author: 'Mikhail Bulgakov', title: 'Master and Margarita' }, '978-0596517748': { isbn: '978-0596517748', author: 'Douglas Crockford', title: 'JavaScript: The Good Parts' }, '978-1593275846': { isbn: '978-1593275846', author: 'Marijn Haverbeke', title: 'Eloquent JavaScript' }};
function getBookByIsbn(isbn, books){ return books[isbn];}
const myBook = getBookByIsbn('978-1593275846', books);

بدلاً من استخدام التكرار ، يمكننا الآن استخدام بحث بسيط على الخريطة بواسطة رقم ISBN للحصول على قيمتنا. لم نعد بحاجة إلى التحقق من قيمة ISBN لكل كائن. نحصل على القيمة مباشرة من الخريطة باستخدام المفتاح.

من حيث الأداء ، سيوفر البحث في الخريطة تحسينًا كبيرًا على التكرار. هذا لأن البحث في الخريطة له تكلفة ثابتة من حيث الحساب. يمكن كتابة هذا باستخدام تدوين Big O كـ O (1) . لا يهم إذا كان لدينا ثلاثة ملايين أو ثلاثة ملايين كتاب ، يمكننا الحصول على الكتاب الذي نريده بالسرعة نفسها عن طريق البحث في الخريطة باستخدام مفتاح ISBN.

خلاصة

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

تريد اختبار المهارات الجديدة الخاصة بك؟ جرب تمرين Crash Override على Codewars.

هل تريد معرفة كيفية كتابة تطبيقات الويب باستخدام JavaScript؟ أدير Constructor Labs ، وهو معسكر تدريبي لتشفير JavaScript لمدة 12 أسبوعًا في لندن. تشمل التقنيات التي يتم تدريسها HMTL و CSS و JavaScript و React و Redux و Node و Postgres . كل ما تحتاجه لإنشاء تطبيق ويب كامل من البداية والحصول على وظيفتك الأولى في الصناعة. الرسوم 3000 جنيه إسترليني وتبدأ المجموعة التالية في 29 مايو. التطبيقات مفتوحة الآن.