Object.keys() / values() / entries()

オブジェクトのキー・値・組を配列で取り出します。継承したものや列挙できないものは入りません。数字に見えるキーが先に来る理由、配列に戻す方法まで実行して確かめます。

実行して検証済み処理系Node 22.22.3対応ES2017難易度●●○○○目安8更新

オブジェクトの中身を配列として取り出します。 オブジェクトには map()filter() も無いので、まず配列にします。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'math', 'english' ] [ 80, 95 ] [ [ 'math', 80 ], [ 'english', 95 ] ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
3 245 math: 80 english: 95 science: 70

上のコードは書き換えて実行できます。項目を1つ足してみてください。

使い分け

返るもの 使う場面
Object.keys() キーの配列 名前だけ要る。件数を数える
Object.values() 値の配列 合計・最大など、値だけ要る
Object.entries() [キー, 値] の配列 両方要る(いちばん多い)
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'c' ] true 1
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a' ] 2 [ 'a', 'b' ]

entries()[キー, 値] の配列を返すので、分割代入で受け取ると読めます。

入らないもの

Object.keys() が返すのは、そのオブジェクト自身が持つ列挙できる文字列のキーだけです。3つとも条件です。

受け継いだものは入らない

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'a' ] 1 2
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ '1', '2', 'b', 'a' ]

child.p読めるのに、Object.keys() には入りません。 「読めるかどうか」と「自身が持っているか」は別です。

for...in は受け継いだものも回します。だから配列にも使ってはいけません。

列挙できないものは入らない

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ 'b', 2, 'a' ]
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[ '0', '1' ] [ '0', '1', '2' ] [ 0, 1 ] [ [ 0, 10 ], [ 1, 20 ] ]

隠したいときは enumerable: false、全部見たいときは getOwnPropertyNames() です。

Symbol のキーは入らない

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{ a: 1, b: 2 } { a: 1 }
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{ math: 80, english: 95 } { math: 160, english: 190, science: 140 }

Symbol は「うっかり列挙されない」ための道具でもあります。

順序

数字に見えるキーが先に小さい順で並びます。そのあとが書いた順です。

javascript
console.log(Object.keys(null));
TypeError: Cannot convert undefined or null to object
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
[] true

b より先に 12 が来ています。書いた順にはなりません。

順序に依存する処理を書かないでください。 順番が要るなら Map か配列を使います。

Map入れた順を保ちます。キーに数値も使えます。

配列や文字列に使うと

添字が文字列で返ります。 配列に使う理由はほぼありません。

配列の添字が欲しいなら array.keys()数値で返る)か entries() を使ってください。

配列からオブジェクトに戻す

Object.fromEntries()entries() の逆です。

**「配列にして、加工して、戻す」**が定型です。

オブジェクトに filter()map() は無いので、この形で代わりにします。

分割代入で先頭を空けておくのは「1つ目は使わない」という書き方です。読み飛ばす意図が伝わります。

null や undefined を渡すと落ちる

通信の結果をそのまま渡すと、ここで落ちます。

?? {} を挟むだけで防げます。

結合と複製の話は オブジェクトを結合する にまとめてあります。

鍵に文字列以外を使いたくなったら、オブジェクトではなく Map の出番です。数値の 1 と文字列の '1' を別の鍵として持てます。 → Map と Set

この記事の根拠

  1. Object.keys — ECMAScript® 2026 Language Specificationtc39.es
  2. Object.entries — ECMAScript® 2026 Language Specificationtc39.es
  3. OrdinaryOwnPropertyKeys — ECMAScript® 2026 Language Specificationtc39.es

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)