いまのところはできないらしい。
class C {
constructor(v) {
this.v = v
}
}
let v1 = new C(1)
let v2 = new C(1)
const map = new Map()
map.set(v1, "ok")
console.log(map) // Map { C { v: 1 } => 'ok' }
console.log(map.get(v2)) // => undefined
しかたがないので toKey()
とか勝手に定義してあちこちで set / get の際に呼べばそりゃ動いたけど嫌。
class C {
toKey() {
return this.v.toString()
}
}
map.set(v1.toKey(), "ok")
map.get(v2.toKey()) // => ok
素の連想配列なら簡潔にアクセスできるうえに toString() の結果をキーにしてくれたりして、新しくできた Map より使いやすいというのはどういうことだろうと思ったりした。
class C {
constructor(v) {
this.v = v
}
toString() {
return this.v.toString()
}
}
let c1 = new C(1)
let c2 = new C(1)
const map = {}
map[c1] = "ok"
console.log(map) // { '1': 'ok' }
console.log(map[c2]) // => ok
参照
How to customize object equality for JavaScript Set - Stack Overflow
https://stackoverflow.com/questions/29759480/how-to-customize-object-equality-for-javascript-set