2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Mapで同じ内容のオブジェクトが見つからない理由:キーの参照とID検索をNode.jsで実測

2
Posted at

map.set({ id: 1 }, value) の後に map.get({ id: 1 }) と書いても、登録した値は取り出せません。オブジェクトをキーにすると、プロパティの一致ではなく、同じオブジェクトかどうかで検索するためです。

2026年11月8日、macOS 27.2/Node.js v24.22.1で実行しました。ブラウザ・Windows・TypeScriptの型検査は試していません。コードを順に同じ .mjs に保存し、node ファイル名.mjs で再現できます。

同じidを書いても、別のキーになる

const key = { id: 1 };
const byObject = new Map([[key, 'Alice']]);
console.log(byObject.get(key));
console.log(byObject.get({ id: 1 }));
console.log(byObject.has({ id: 1 }));
console.log(key === { id: 1 });

出力:

Alice
undefined
false
false

保存した key を渡すと取得でき、新しく作った { id: 1 } では取得できません。ここでの === もfalseです。has もfalseなので、単に値がundefinedなのではなく、そのキーが存在しません。

ECMAScriptのMap.prototype.getと値の比較の定義が根拠です。オブジェクトのプロパティを順に比べる処理ではありません。

中身を書き換えても、同じキーのまま

先ほどの key のidを変更します。

key.id = 2;
console.log(byObject.get(key));
console.log(byObject.get({ id: 2 }));
console.log([...byObject.keys()][0].id);

出力:

Alice
undefined
2

idが変わっても、同じ key ならAliceを取得できました。一方、変更後と同じ内容の { id: 2 } では見つかりません。

保存されたキーを取り出すと、変更後のidである2が見えています。

IDで検索したいなら、ID自体をキーにする

「別に作ったデータでも、idが一致すれば取り出したい」という用途なら、キーをidにします。この例では一意な数値IDを使います。

const users = [{ id: 1, name: 'Alice' }];
const byId = new Map(users.map(user => [user.id, user]));
const request = { id: 1 };
console.log(byId.get(request.id)?.name);
console.log(byId.get('1'));

出力:

Alice
undefined

検索元の request は別のオブジェクトですが、数値1を渡して取得できました。ただし文字列の '1' では見つかりません。登録側と検索側でIDの型も合わせる必要があります。

同じオブジェクトそのものに情報を関連付けたいなら、最初の書き方が目的に合います。IDで探すのか、オブジェクト自体を区別するのかを決めます。

getのundefinedだけでは、未登録と決められない

値にundefinedを保存できるため、存在確認は has で分けます。

const values = new Map([['saved', undefined]]);
console.log(values.get('saved'), values.has('saved'));
console.log(values.get('missing'), values.has('missing'));

出力:

undefined true
undefined false

AIがMapを使うコードを書いたら、登録時と検索時のキーを見比べます。同じ参照、同じ内容の別オブジェクト、数値と文字列をそれぞれ渡すと、どの一致を前提にしたコードか確認できます。


未経験者向けの体験版を公開しています

※ 中上級者には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?