Я пытаюсь использовать ES6 от TypeScript через lib.es6.d.ts. Мне нужно понять, как enforce equality comparison and sameness для объекта для использования в Set<T>
. Например, объект выглядит следующим образом.Как проверить равенство и идентичность экземпляров класса в отношении использования коллекции Set ES6?
class Product {
metadata: Map<String, String>
constructor(id: number) {
metadata = new Map<String, String>();
}
public addMetadata(key: String, val: String): Product {
this.metadata.set(key, val);
return this;
}
}
Обратите внимание, что id
значение поля в Product
является то, что определяет его уникальность. Если два экземпляра продукта имеют одинаковый идентификатор, они считаются одинаковыми в моем приложении, даже если metadata
отличается. В общем, я хочу только лишь подмножество полей, которые будут использоваться как часть тестирования для равенства и одинаковости.
В Java мы переопределяем метод equals
для контроля и проверки на идентичность. В JavaScript, что нам нужно сделать, чтобы определить сходство?
В link on MDN гласит следующее:
Поскольку каждое значение в наборе должен быть уникальным, то значение равенства будет проверяться.
Я предполагаю, что при значении равенства они означают ===
? Опять же, MDN shows 4 equality algorithms только в ES2015.
В принципе, в моем классе выше, я хочу сделать что-то вроде следующего.
let p1 = new Product(1);
let p2 = new Product(2);
let p3 = new Product(1); //duplicate of p1 by id
p1.addMetadata('k1','v1').addMetadata('k2','v2');
p2.addMetadata('k1','v1');
let mySet = new Set<Product>();
mySet.add(p1);
mySet.add(p2);
mySet.add(p3);
assertEquals(2, mySet.size); //some assertion method
У меня нет хорошего ответа, но я могу прояснить ситуацию. В javascript «==» или «===» для не-примитивов используется ссылочное равенство. Таким образом, это должен быть тот же самый экземпляр для оценки «true» (вообще не проверяет свойства). Я долго не смотрел в «Set» и «Map», но, надеюсь, это помогло. – Adrian
Возможный дубликат [Как настроить выравнивание объектов для набора JavaScript] (http://stackoverflow.com/questions/29759480/how-to-customize-object-equality-for-javascript-set) – Adrian
@Aliester - как один который дал ответ на этот другой вопрос, я действительно не думаю, что это дурак. Вопрос здесь совершенно другой. Чтение этого другого ответа, вероятно, даст вам некоторую информацию, которую можно было бы использовать, чтобы ответить на этот вопрос, но никто не скажет, что этот вопрос такой же, как этот вопрос. – jfriend00