Object.values とは何か
Object.values は「オブジェクトが“自分で持つ”列挙可能なプロパティの値だけを、配列で返す」関数です。ここが重要です:返るのは“自前の”かつ“enumerable: true”な“値”で、キー(名前)は含まれません。継承(プロトタイプ)上の値や Symbol キーの値は対象外です。
const user = { id: 1, name: "Alice" };
console.log(Object.values(user)); // [1, "Alice"]
JavaScript返される値の範囲と順序(深掘り)
含まれる値・含まれない値
- 含まれる: 自身が持つ列挙可能なプロパティの値(通常のオブジェクトリテラルで作ったもの)。
- 含まれない: 継承プロパティの値、non-enumerable の値(defineProperty で enumerable: false)、Symbol キーの値。
const k = Symbol("secret");
const obj = {};
Object.defineProperty(obj, "hidden", { value: 1, enumerable: false });
obj[k] = 123;
obj.visible = 2;
console.log(Object.values(obj)); // [2]
JavaScript並び順のルール
- 数値っぽいキーの値: 先にキーの昇順で並ぶ(”0″, “1”, “2”, …)。
- それ以外のキーの値: 追加順で並ぶ。 配列では“存在するインデックス”の値だけが並び、穴(疎配列)はスキップされます。
const arr = [];
arr[2] = "X";
arr[10] = "Y";
console.log(Object.values(arr)); // ["X", "Y"]
JavaScript安全な使い方(例外回避・関連メソッドの使い分け)
null/undefined へのガード
Object.values は“オブジェクト以外”に使うと TypeError になります。まずガードしましょう。
function safeValues(x) {
return x != null && typeof x === "object" ? Object.values(x) : [];
}
JavaScriptkeys / entries との違いと相互変換
- Object.keys(obj): キーの配列
- Object.values(obj): 値の配列
- Object.entries(obj): [キー, 値] の配列
const obj = { id: 1, name: "Alice" };
Object.keys(obj); // ["id", "name"]
Object.values(obj); // [1, "Alice"]
Object.entries(obj); // [["id",1],["name","Alice"]]
JavaScriptループ・整形の定番レシピ(可読性重視)
合計・平均などの数値集計
const report = { Q1: 120, Q2: 80, Q3: 200 };
const nums = Object.values(report); // [120, 80, 200]
const sum = nums.reduce((a, n) => a + n, 0); // 400
const avg = nums.length ? sum / nums.length : 0; // 133.33...
JavaScript値の検証・フィルタ(null/undefined を掃除)
const user = { id: 1, name: null, email: "a@x" };
const present = Object.values(user).filter(v => v != null);
// [1, "a@x"]
JavaScript値だけソートして使う(出力整形)
const scores = { alice: 80, bob: 95, carol: 70 };
const sorted = Object.values(scores).sort((a, b) => b - a);
// [95, 80, 70]
JavaScript配列・疎配列での理解(穴・length・値のみ列挙)
疎配列の“穴はスキップ”
const arr = Array(3); // [ <3 empty items> ]
console.log(Object.values(arr)); // [](存在値なし)
arr[1] = "B";
console.log(Object.values(arr)); // ["B"]
JavaScriptlength は列挙されない
配列の “length” は自前プロパティですが非列挙なので、Object.values(arr) には出てきません。配列要素を処理したいなら、for…of/map/forEach を基本に使い、Object.values は“オブジェクトの値列挙”に使い分けると読みやすいです。
実務で役立つパターン(頻度集計・検索・比較)
値の頻度(ヒストグラム)
const tagsByUser = { a: "js", b: "web", c: "js" };
const freq = Object.values(tagsByUser).reduce((acc, t) => {
acc[t] = (acc[t] ?? 0) + 1;
return acc;
}, {});
// { js: 2, web: 1 }
JavaScript値の存在チェック(some / includes)
const dict = { a: "Pen", b: "Pencil", c: "Eraser" };
const hasPen = Object.values(dict).includes("Pen"); // true
const anyLong = Object.values(dict).some(v => v.length >= 6); // true
JavaScript差分検出(値の変化だけ見る)
function changedValues(prev, next) {
const out = {};
for (const [k, v] of Object.entries(next)) {
if (v !== prev[k]) out[k] = { from: prev[k], to: v };
}
return out;
}
JavaScriptよくある落とし穴と回避策(重要ポイントの深掘り)
Symbol キーの値は返らない
内部フラグに Symbol を使っている場合、Object.values では列挙されません。必要なら Object.getOwnPropertySymbols と組み合わせて取得します。
non-enumerable の見落とし
defineProperty で enumerable: false にした値は列挙されません。“全部の自前プロパティの値”が必要なら、Object.getOwnPropertyNames を使い、そこから値へアクセスします。
null/undefined の右辺
Object.values(null) は例外になります。外部入力やネストに対しては、必ず「!= null かつ typeof === ‘object’」でガードしてから呼びます。
配列処理への誤用
配列の要素走査に Object.values を使うより、for…of/map/filter のほうが意図が明確で可読性が高いです。Object.values は“オブジェクトを配列に変換”したいときに使います。
まとめ
Object.values は「自前の列挙可能な“値だけ”を配列で得る」ための入口です。継承・Symbol・non-enumerable は対象外で、順序は“数値っぽいキーの値が先、他は追加順”。例外対策として null/undefined ガードを徹底し、用途に応じて keys/entries と使い分ける。配列処理には専用の構文を使い、値の集計・検索・整形では Object.values を活用する。これを押さえれば、初心者でも明快で安全な“値中心”のオブジェクト操作が書けます。
