[javascript] كيفية تخصيص مساواة الكائنات لمجموعة جافا سكريبت


1 Answers

كما هو مذكور في إجابة jfriend00 ، قد لا يكون تخصيص علاقة المساواة ممكنًا .

تقدم التعليمة البرمجية التالية مخطط تفصيلي للمشكلة حسابياً (ولكن تكلفة الذاكرة):

class GeneralSet {

    constructor() {
        this.map = new Map();
        this[Symbol.iterator] = this.values;
    }

    add(item) {
        this.map.set(item.toIdString(), item);
    }

    values() {
        return this.map.values();
    }

    // ...
}

يجب على كل عنصر مدرج تنفيذ الأسلوب toIdString() الذي يقوم بإرجاع السلسلة. تعتبر كائنين متساوية إذا وفقط إذا كانت أساليب toIdString الخاصة بها toIdString بإرجاع نفس القيمة.

Question

تقدم ES 6 الجديدة (الوئام) كائن Set جديدة. تشبه خوارزمية الهوية المستخدمة بواسطة Set المشغل === وبالتالي فهي غير مناسبة لمقارنة الأشياء:

var set = new Set();
set.add({a:1});
set.add({a:1});
console.log([...set.values()]); // Array [ Object, Object ]

كيفية تخصيص المساواة لكائنات مجموعة من أجل القيام بمقارنة الأشياء العميقة؟ هل هناك أي شيء مثل جافا equals(Object) ؟




ربما يمكنك محاولة استخدام JSON.stringify() للقيام بمقارنة الأشياء العميقة.

فمثلا :

const arr = [
  {name:'a', value:10},
  {name:'a', value:20},
  {name:'a', value:20},
  {name:'b', value:30},
  {name:'b', value:40},
  {name:'b', value:40}
];

const names = new Set();
const result = arr.filter(item => !names.has(JSON.stringify(item)) ? names.add(JSON.stringify(item)) : false);

console.log(result);




Related