اذهب إلى المحتوى
  • 0

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

Roog Roog

السؤال

let car={
        make:'kia',
        model:'rio',
        year: 1999
}
let car1={
        make:'kia',
        model:'rio',
        year: 1999
}
let compareCar=function(car,car1){
        if ( car.key=== car1.key && car[key]===car1[key]) return true;
        else return false;
}

let result=compareCar(car,car1);
console.log(result);

سؤال من بعد اذنكون:

ليش لما بستخدم && بيعطيني خطأ انو (key is not defined) وبس استخدم || ما بيطلع هاد الخطأ .

وليش الكود ما عم يشتغل ، برأيي انا انو الفكرة ظابطة 😅، شكرا سلفا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0
بتاريخ 6 دقائق مضت قال Roog Roog:

سؤال اذا ممكن :

ليش لما بستخدم && بيعطيني خطأ انو (key is not defined) وبس استخدم || ما بيطلع هاد الخطأ .

وسؤالي بالنسبة للكود كان:

انو ليش ما اشتغل صح ، حسيت انا انو الطريقة صح ،شكرا

في دالة compareCar، يجب أن تقوم بالمقارنة بين جميع خصائص الكائنين car و car1، لذلك يحتاج الدالة إلى إجراء حلقة للتحقق من جميع الخصائص.

عند التحقق من الخصائص، يجب استخدام [] بدلاً من . للوصول إلى قيمة الخاصية، لأن اسم الخاصية غير معروف مسبقًا.

عند التحقق من قيمة الخاصية، يجب استخدام === للمقارنة بين القيم وليس == لأن === يقارن أيضًا نوع القيمة.

وإليك الحل الصحيح:

let car = {
  make: 'kia',
  model: 'rio',
  year: 1999
};

let car1 = {
  make: 'kia',
  model: 'rio',
  year: 1999
};

let compareCar = function(car, car1) {
  // الحصول على مفاتيح الكائنين
  let keys1 = Object.keys(car);
  let keys2 = Object.keys(car1);

  // التحقق مما إذا كان عدد المفاتيح متساويًا
  if (keys1.length !== keys2.length) {
    return false;
  }

  // مقارنة مفاتيح وقيم الكائنين
  for (let key of keys1) {
    if (car[key] !== car1[key]) {
      return false;
    }
  }

  return true;
};

let result = compareCar(car, car1);
console.log(result); // النتيجة: true

وبخصوص سؤالك

بتاريخ 6 دقائق مضت قال Roog Roog:

ليش لما بستخدم && بيعطيني خطأ انو (key is not defined) وبس استخدم || ما بيطلع هاد الخطأ .

 

عند استخدام && في الشرط، فإنه يقوم بتقييم الشرط بالكامل قبل أن يقرر إذا ما كان يجب تنفيذ الجزء الذي يليه أم لا.

وفي حالة الشرط car.key === car1.key && car[key] === car1[key]، الجزء الأول car.key === car1.key يقارن بين الخاصية key في الكائن car والكائن car1.

لكن في تلك الحالة، لا يوجد خاصية اسمها key موجودة في كلا الكائنين، لذلك يتم رفع خطأ key is not defined، ولا يتم الوصول للجزء الثاني من الشرط.

بالنسبة لاستخدام ||، عند استخدامه في الشرط car.key === car1.key || car[key] === car1[key]، فإنه يقوم بتقييم الشرط وإذا كان أي جزء من الشرط صحيحًا (بمعنى أن الخاصية key موجودة في أحد الكائنين)، فإنه يعتبر الشرط صحيحًا دون الحاجة للتحقق من الجزء الثاني من الشرط. ولذلك لا يظهر خطأ key is not defined عند استخدام ||.

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

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

إن المعاملان && , || لديهما خاصية تدعى بالدارة القصيرة short circuit و التي تعني أنه يتم التنفيذ بشكل تسلسلي للشروط، و في حال كنا متأكدين من قيمة الشرط في لحظة ما لا يتم متابعة التنفيذ.

في حالة && فإنها تقف في حال وجدت أي شرط خاطئ، لأن عملية and ستكون نتيجتها false في حال كان أي شرط false.

أما في حالة || فإنها تقف في حال وجدت أي شرط صحيح، لأن عملية or ستكون نتيجتها true في حال كان أي شرط true.

لذلك في حالة استعمالك لل and كان الشرط الأول صحيح فأكمل و نفذ الشرط الثاني.

أما في حالة استعمالك لل or فقد وجد الشرط الأول صحيح فلم يكمل، لذلك لم يظهر الخطأ.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 3 ساعة قال Roog Roog:

شكرا .

انا كنت مفكر باستخدامي (car.key) بكون عم استهدف اسم الخواص للكائن properties.

وباستخدامي (car[key]) بكون عم استهدف  قيمة الخواص value.

فهمك تقريبا صحيح، 

فبإستعمالك السياق التالي: 

car.key

أنت تحاول قراءة الخاصية key من الكائن car، فإن كان الكائن car هو ما كالتالي: 

const car = {
  key: 'value',
  color: 'blue',
  brand: 'Toyota'
};

كان عائد car.key هو 'value'

أما السياق التالي: 

car[key]

فهو سيعني قراءة الخاصية الموافقة لقيمة المتغير key. فإن كان المتغير key هو ما كالتالي: 

var key = 'brand';

فإن الموافق لـ car[key] سيكون هو 'Toyota' وليس 'value'

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الخطأ الذي تواجهه مرتبط بالطريقة التي تقوم بها بمقارنة الخصائص (properties) بين الكائنين car و car1 في دالة compareCar. دعوني أشرح مشكلتك وأقدم لك الحلاً:

1. المشكلة الأولى:
في السطر:

if (car.key === car1.key && car[key] === car1[key])

أنت تحاول الوصول إلى خاصية "key" في الكائنين car و car1، ولكن هذه الخاصية ليست معرفة مسبقًا في هذه الكائنات. هذا هو ما يسبب الخطأ "key is not defined".

2. المشكلة الثانية:

عند استخدام && ، يعتمد JavaScript على تنفيذ المقارنات بالترتيب المحدد. إذا كانت القيمة undefined (لأن المتغير key لم يتم تعريفه بعد) في الشرط الأول ، فيتوقف عن التنفيذ ويحتفظ بالقيمة `undefined` ويعرض رسالة الخطأ. وفي حالة `||` ، يعتبر القيمة `undefined` قيمة "غير حقيقية" أو "false" ومن ثم ينتقل إلى التعبير الثاني.

3. عدم اختبار الخصائص المحددة:
كنت تحاول الوصول إلى الخصاصية key ، ولكن ما تريده في الواقع هو مقارنة الخصائص المحددة (make، model، year) بين الكائنين.

لتصحيح هذا، يمكنك استخدام الكود التالي:

let compareCar = function(car, car1) {
    if (car.make === car1.make && car.model === car1.model && car.year === car1.year) {
        return true;
    } else {
        return false;
    }
}

حل أفضل

 استخدم المتغير المحدد في حلقة التكرار (for in) للمقارنة بين مفاتيح الكائنين.

الكود الصحيح:

let car = {
  make: 'kia',
  model: 'rio',
  year: 1999
};

let car1 = {
  make: 'kia',
  model: 'rio',
  year: 1999
};

let compareCar = function(car, car1) {
  for (let key in car) {
    if (car[key] !== car1[key]) {
      return false;
    }
  }
  return true;
};

let result = compareCar(car, car1);
console.log(result);

بعد التعديلات المذكورة أعلاه، يجب أن يعمل الكود بشكل صحيح ويُطبع "true" إذا كانت جميع المفاتيح والقيم متطابقة و "false" في حالة عدم التطابق.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 4‏/8‏/2023 at 12:52 قال Mustafa Suleiman:

في دالة compareCar، يجب أن تقوم بالمقارنة بين جميع خصائص الكائنين car و car1، لذلك يحتاج الدالة إلى إجراء حلقة للتحقق من جميع الخصائص.

عند التحقق من الخصائص، يجب استخدام [] بدلاً من . للوصول إلى قيمة الخاصية، لأن اسم الخاصية غير معروف مسبقًا.

عند التحقق من قيمة الخاصية، يجب استخدام === للمقارنة بين القيم وليس == لأن === يقارن أيضًا نوع القيمة.

وإليك الحل الصحيح:

let car = {
  make: 'kia',
  model: 'rio',
  year: 1999
};

let car1 = {
  make: 'kia',
  model: 'rio',
  year: 1999
};

let compareCar = function(car, car1) {
  // الحصول على مفاتيح الكائنين
  let keys1 = Object.keys(car);
  let keys2 = Object.keys(car1);

  // التحقق مما إذا كان عدد المفاتيح متساويًا
  if (keys1.length !== keys2.length) {
    return false;
  }

  // مقارنة مفاتيح وقيم الكائنين
  for (let key of keys1) {
    if (car[key] !== car1[key]) {
      return false;
    }
  }

  return true;
};

let result = compareCar(car, car1);
console.log(result); // النتيجة: true

وبخصوص سؤالك

عند استخدام && في الشرط، فإنه يقوم بتقييم الشرط بالكامل قبل أن يقرر إذا ما كان يجب تنفيذ الجزء الذي يليه أم لا.

وفي حالة الشرط car.key === car1.key && car[key] === car1[key]، الجزء الأول car.key === car1.key يقارن بين الخاصية key في الكائن car والكائن car1.

لكن في تلك الحالة، لا يوجد خاصية اسمها key موجودة في كلا الكائنين، لذلك يتم رفع خطأ key is not defined، ولا يتم الوصول للجزء الثاني من الشرط.

بالنسبة لاستخدام ||، عند استخدامه في الشرط car.key === car1.key || car[key] === car1[key]، فإنه يقوم بتقييم الشرط وإذا كان أي جزء من الشرط صحيحًا (بمعنى أن الخاصية key موجودة في أحد الكائنين)، فإنه يعتبر الشرط صحيحًا دون الحاجة للتحقق من الجزء الثاني من الشرط. ولذلك لا يظهر خطأ key is not defined عند استخدام ||.

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

بالشرط الاول قارنا طول properties  وبالشرط التاني قارنا values حسب ما فهمت .

بس وين قارنا properties اذا متطابقين مش الطول .

شكرا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...