JavaScript | 配列・オブジェクト:オブジェクト操作 – Object.values

JavaScript JavaScript
スポンサーリンク

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) : [];
}
JavaScript

keys / 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"]
JavaScript

length は列挙されない

配列の “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 を活用する。これを押さえれば、初心者でも明快で安全な“値中心”のオブジェクト操作が書けます。

タイトルとURLをコピーしました