Language
Set: オブジェクトの重複判定は参照同一性で行う
Set は同じ形の別オブジェクトを自動で同じ値として扱いません。
SourceuserIdSets.ts
Node.js 22
export type User = Readonly<{ id: string }>;
export function uniqueUserIds(users: readonly User[]): Set<string> {
return new Set(users.map((user) => user.id));
}TestuserIdSets.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { uniqueUserIds } from "../../src/set/userIdSets.js";
test("別インスタンスの同じIDはSetで重複しない", () => {
const users = [{ id: "u-42" }, { id: "u-42" }];
assert.equal(new Set(users).size, 2);
assert.equal(uniqueUserIds(users).size, 1);
});01Assertion
このテストで確認できること
- 同じ id を持つ別オブジェクトを Set に追加できる
- 値として一意にするにはプリミティブ ID をキーにする
Java の equals/hashCode 契約とは異なり、JavaScript の Set に任意のオブジェクト値比較はありません。ドメイン ID を Set<string> にする方針が単純です。
OBSERVED RESULT
expected: new Set([{id:"u-42"}, {id:"u-42"}]).size → 2
actual: 2