如何在每个条目等于时创建一个在Set中相等的Pair类?

问题描述 投票:1回答:2
class Pair {
    constructor(x, y) {
        this.x = x
        this.y = y
    }
    // TODO ?
}
const set = new Set()
set.add(new Pair(1, 2))

如何使后续声明返回true?

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

(我们可以在Java中覆盖equalshashCode类的Pair

javascript hashset
2个回答
3
投票

现在覆盖平等检查是不可行的:https://stackoverflow.com/a/29759699/7803502

相反,你可以扩展Set类来创建自己的PairSet

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
})()

4
投票

如果引用指向内存中的相同值,则引用将是相等的 - 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)))

或者,如果您希望所有操作都在构造函数中,您可以让构造函数显式创建/返回实例,尽管IMO有点不太清楚,并且有点奇怪:

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属性,否则缓存机制将更难以推理。如果您想要这种可变的缓存功能,可以考虑在实例数组上使用.find

© www.soinside.com 2019 - 2024. All rights reserved.