Как создать класс Pair, равный в Set, если каждая запись равна? - PullRequest
0 голосов
/ 27 февраля 2019
class Pair {
    constructor(x, y) {
        this.x = x
        this.y = y
    }
    // TODO ?
}
const set = new Set()
set.add(new Pair(1, 2))

Как заставить оператор follow возвращать true?

set.has(new Pair(1, 2)) // -> false

(Мы можем переопределить equals и hashCode класса Pair в Java)

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Отмена проверки на равенство сейчас невозможна: https://stackoverflow.com/a/29759699/7803502

Вместо этого вы можете расширить класс Set, чтобы создать свой собственный PairSet.

* 1009.*
class Pair {
  constructor(x, y) {
    this._x = x
    this._y = y
  }
  
  toString() {
    return [
      this._x,
      this._y,
    ].join(',')
  }
}

class PairSet extends Set {
  add(pair) {
    return super.add(pair.toString())
  }
  
  has(pair) {
    return super.has(pair.toString())
  }
  
  delete(pair) {
    return super.delete(pair.toString())
  }
}

(function test() {
  const set = new PairSet()
  set.add(new Pair(1, 2))
  console.log(set.has(new Pair(1, 2))) // true
  console.log(set.has(new Pair(2, 1))) // false
})()
0 голосов
/ 27 февраля 2019

Ссылки будут равны, только если они указывают на одно и то же значение в памяти - new (по умолчанию) создаст новый объект, который не может быть === для отдельного объекта.Я полагаю, что один из вариантов - вернуть существующий экземпляр x,y Pair, если он был построен ранее:

const pairs = {};
function getMakePair(x, y) {
  const str = x + ',' + y;
  if (pairs[str]) {
    return pairs[str];
  }
  const pair = new Pair(x, y);
  pairs[str] = pair;
  return pair;

}
class Pair {
  constructor(x, y) {
    this.x = x
    this.y = y
  }
}

const set = new Set()
set.add(getMakePair(1, 2))
console.log(set.has(getMakePair(1, 2)))

Или, если вы хотите, чтобы все действия были в конструкторе, вы можете сделать так, чтобы конструктор явно создавал / возвращал экземпляр, хотя это немного менее понятно для ИМО, и этонемного странно видеть:

class Pair {
  constructor(x, y) {
    const str = x + ',' + y;
    if (Pair.pairs[str]) {
      return Pair.pairs[str];
    }
    const instance = Object.create(Pair.prototype);
    instance.x = x
    instance.y = y
    Pair.pairs[str] = instance;
    return instance;
  }
}
Pair.pairs = {};

const set = new Set()
set.add(new Pair(1, 2))
console.log(set.has(new Pair(1, 2)))

Конечно, если вы используете такой метод для кэширования экземпляров, вы не должны изменять свойство .x / .y экземпляра, иначе кешированиеМеханизм будет сложнее рассуждать.Если вам нужна такая функция кэширования mutable , вы можете вместо этого использовать .find в массиве экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...