ネストしたオブジェクトのすべてのキーを配列として取得するには、再帰的に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"
// ]-
基本ロジック:
Object.keys()を使って現在のオブジェクトのキーを取得します。- 各キーについて、その値がネストされたオブジェクトであれば再帰的に探索します。
-
ドット表記への変換:
- ネストされたキーは親のキーと組み合わせて、
"parent.child"の形式で表現しています。
- ネストされたキーは親のキーと組み合わせて、
-
配列や非オブジェクト型の処理:
- 配列は通常のオブジェクトと区別されるため、必要に応じて別の処理を追加可能です。
ドット表記を使用しない場合、以下のように実装を変更します。
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()で条件を調整します。
- 配列内のキーも含めたい場合は、
- パフォーマンス:
- ネストが深い場合、再帰処理によるパフォーマンス低下に注意が必要です。
これで、ネストしたオブジェクトのすべてのキーを柔軟に取得できます!