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

JavaScript JavaScript
スポンサーリンク

Object.entries とは何か

Object.entries は「オブジェクトが“自分で持つ”列挙可能な文字列キーとその値の組([key, value])」を、配列として返す関数です。ここが重要です:返るのは“自前の・enumerable: true・文字列キー”だけ。継承(プロトタイプ)上のキー、Symbol キー、non-enumerable は含まれません。

const user = { id: 1, name: "Alice" };
console.log(Object.entries(user)); // [["id", 1], ["name", "Alice"]]
JavaScript

返される内容と順序のルール

何が含まれて、何が含まれないか

  • 含まれる: そのオブジェクト自身の、列挙可能な文字列キーと値。
  • 含まれない: 継承キー(プロトタイプ上のもの)、Symbol キー、non-enumerable(definePropertyでenumerable:false)。
const k = Symbol("secret");
const obj = {};
Object.defineProperty(obj, "hidden", { value: 1, enumerable: false });
obj[k] = 123;
obj.visible = 2;
console.log(Object.entries(obj)); // [["visible", 2]]
JavaScript

並び順の基本

  • 数値っぽいキー: まず昇順(”0″,”1″,”2″,…)。
  • それ以外のキー: 追加順。 配列では“存在するインデックスだけ”が文字列キーとして並びます(穴はスキップ)。
const arr = [];
arr[2] = "X";
arr[10] = "Y";
console.log(Object.entries(arr)); // [["2","X"], ["10","Y"]]
JavaScript

安全な使い方と関連メソッドの違い

null/undefined ガード(例外回避)

Object.entries は非オブジェクトに対して TypeError。まず守りを入れます。

function safeEntries(x) {
  return x != null && typeof x === "object" ? Object.entries(x) : [];
}
JavaScript

keys / values との使い分け

  • Object.keys(obj): キー配列([“id”,”name”])
  • Object.values(obj): 値配列([1,”Alice”])
  • Object.entries(obj): [キー, 値] 配列([[“id”,1],[“name”,”Alice”]])

entries は「キーと値を同時に扱う」処理(変換・フィルタ・マッピング)に最適です。


実践レシピ(変換・フィルタ・集計)

オブジェクトを別のオブジェクトへ変換(fromEntries と対)

Object.entries と Object.fromEntries は“往復可能”です。キー・値を加工して戻せます。

const prices = { pen: 120, book: 800 };
const withTax = Object.fromEntries(
  Object.entries(prices).map(([k, v]) => [k, Math.round(v * 1.1)])
);
// { pen: 132, book: 880 }
JavaScript

条件付きでキーごとにフィルタ

const report = { apples: 10, bananas: 5, cars: 2 };
const fruits = Object.fromEntries(
  Object.entries(report).filter(([k]) => k === "apples" || k === "bananas")
);
// { apples: 10, bananas: 5 }
JavaScript

値の型でフィルタして整形

const mixed = { a: 1, b: "x", c: 2 };
const numbersOnly = Object.fromEntries(
  Object.entries(mixed).filter(([, v]) => typeof v === "number")
);
// { a: 1, c: 2 }
JavaScript

合計・集計(値だけを取り出して計算)

const sales = { Q1: 120, Q2: 80, Q3: 200 };
const total = Object.entries(sales).reduce((acc, [, v]) => acc + v, 0); // 400
JavaScript

ループと整形の可読性向上テクニック

for…of で読みやすく処理

const obj = { a: 1, b: 2 };
for (const [k, v] of Object.entries(obj)) {
  console.log(`${k}=${v}`);
}
JavaScript
  • ラベルと値を同時に扱う: if 条件や変換が簡潔になる。
  • 配列より意図が明確: “オブジェクトを列挙している”ことが一目で分かる。

ソートして安定出力

const cfg = { z: 3, a: 1, b: 2 };
const sorted = Object.entries(cfg).sort(([k1], [k2]) => k1.localeCompare(k2));
// [["a",1],["b",2],["z",3]]
JavaScript
  • 出力・比較に強い: まず entries→ソート→fromEntries で“安定化”できます。

配列・Map との橋渡し(構造変換の定番)

オブジェクト→Map(順序とメソッドが欲しいとき)

const obj = { a: 1, b: 2 };
const m = new Map(Object.entries(obj));
m.get("a"); // 1
JavaScript

Map→オブジェクト(軽量にしたいとき)

const m = new Map([["x", 10], ["y", 20]]);
const obj = Object.fromEntries(m);
// { x: 10, y: 20 }
JavaScript

配列のレコード化(キーをフィールドに)

const rows = [["id", 1], ["name", "Alice"]];
const record = Object.fromEntries(rows);
// { id: 1, name: "Alice" }
JavaScript

よくある落とし穴と回避策(重要ポイントの深掘り)

Symbol キーは含まれない

内部フラグを Symbol で持つ場合、entries には出ません。必要なら Object.getOwnPropertySymbols(obj) と組み合わせ、手動で連結して扱います。

non-enumerable の見落とし

Object.defineProperty(obj, "x", { enumerable: false }) の値は列挙されません。“全部の自前プロパティ”が必要なら Object.getOwnPropertyNames(obj) を使い、値は手動で取得します。

null/undefined の右辺

Object.entries(null) は例外。外部入力やネストに対しては x != null && typeof x === "object" のガードを徹底してください。

既知のフィールドだけを送りたいときの検証

継承キーは含まれないものの、意図しない追加フィールドが混ざることがあります。送信前は許可リストで絞るか、Object.hasOwn を用いて対象フィールドのみ収集する設計が安全です。

function pick(obj, keys) {
  return Object.fromEntries(keys.filter(k => Object.hasOwn(obj, k)).map(k => [k, obj[k]]));
}
JavaScript

まとめ

Object.entries は「自前の、列挙可能な文字列キーとその値」を配列の形で一度に扱える入り口です。キーと値を同時に処理できるため、フィルタ・変換・ソート・再構築(fromEntries)まで一連の整形が読みやすく書けます。継承・Symbol・non-enumerable は対象外、順序は数値っぽいキーが先、その後に追加順。null/undefined ガード、keys/values との使い分け、Map/配列への橋渡しを押さえれば、初心者でも明快で安全なオブジェクト操作を設計できます。

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