Skip to content

Instantly share code, notes, and snippets.

@yukikim
Created December 1, 2024 16:31
Show Gist options
  • Save yukikim/07d35cf273b70754df4ac7567cc1d55e to your computer and use it in GitHub Desktop.
Save yukikim/07d35cf273b70754df4ac7567cc1d55e to your computer and use it in GitHub Desktop.
オブジェクトのキーを配列にする

ネストしたオブジェクトのすべてのキーを配列として取得するには、再帰的にObject.keys()を使ってネストされた部分まで探索する必要があります。

以下に、ネストされたオブジェクトからすべてのキーを取得する方法を示します。

実装例

type NestedObject = {
  [key: string]: any;
};

function getAllKeys(obj: NestedObject): string[] {
  let keys: string[] = [];

  for (const key of Object.keys(obj)) {
    keys.push(key);
    const value = obj[key];
    if (value && typeof value === "object" && !Array.isArray(value)) {
      // ネストされたオブジェクトの場合、再帰的に探索
      const nestedKeys = getAllKeys(value);
      // 現在のキーとネストされたキーを組み合わせる(ドット表記にする場合も可能)
      keys = keys.concat(nestedKeys.map(nestedKey => `${key}.${nestedKey}`));
    }
  }

  return keys;
}

// 使用例
const nestedObj = {
  name: "Alice",
  age: 25,
  address: {
    city: "Tokyo",
    zip: "123-4567",
    location: {
      latitude: 35.6895,
      longitude: 139.6917,
    },
  },
};

const allKeys = getAllKeys(nestedObj);
console.log(allKeys);
// 出力: [
//   "name",
//   "age",
//   "address",
//   "address.city",
//   "address.zip",
//   "address.location",
//   "address.location.latitude",
//   "address.location.longitude"
// ]

解説

  1. 基本ロジック:

    • Object.keys()を使って現在のオブジェクトのキーを取得します。
    • 各キーについて、その値がネストされたオブジェクトであれば再帰的に探索します。
  2. ドット表記への変換:

    • ネストされたキーは親のキーと組み合わせて、"parent.child"の形式で表現しています。
  3. 配列や非オブジェクト型の処理:

    • 配列は通常のオブジェクトと区別されるため、必要に応じて別の処理を追加可能です。

ネストを区別せずフラットなキーの配列を取得したい場合

ドット表記を使用しない場合、以下のように実装を変更します。

function getAllKeysFlat(obj: NestedObject): string[] {
  let keys: string[] = [];

  for (const key of Object.keys(obj)) {
    keys.push(key);
    const value = obj[key];
    if (value && typeof value === "object" && !Array.isArray(value)) {
      keys = keys.concat(getAllKeysFlat(value));
    }
  }

  return keys;
}

const flatKeys = getAllKeysFlat(nestedObj);
console.log(flatKeys);
// 出力: ["name", "age", "address", "city", "zip", "location", "latitude", "longitude"]

注意点

  • 型の扱い:
    • 再帰的に型を明示したい場合、ジェネリックを使用して型安全に拡張可能です。
  • 配列の扱い:
    • 配列内のキーも含めたい場合は、Array.isArray()で条件を調整します。
  • パフォーマンス:
    • ネストが深い場合、再帰処理によるパフォーマンス低下に注意が必要です。

これで、ネストしたオブジェクトのすべてのキーを柔軟に取得できます!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment