📖
React、Typescrptで、動的なkeyを使ったオブジェクト操作
表題の通り、動的なkeyを使ったオブジェクトの操作に手こずったので、備忘録として記載します。
どなたかの参考になれば幸いです。
-
useState
を使用し動的なkeyをオブジェクトのkeyにし、生成する
useHook.ts
import { useState } from 'react';
const useHooks = () => {
const [state, setState] = useState({});
const setKey = (setKey: number) => {
setState((oldState) => {
return { ...oldState, [setKey]: setKey };
});
};
};
引数setKey
をブラケットで囲むことで、オブジェクトのkeyとして定義できます。
valueにもsetKey
を指定してますが、他の値でも構いません。
-
useState
を使用し動的なkeyを使って、単一のプロパティをオブジェクトから削除
useHook.ts
import { useState } from 'react';
type State = { [key: string]: number };
const useHooks = () => {
const [state, setState] = useState<State>({});
const removeKey = (removeKey: number) => {
setState((oldState) => {
const { [removeKey]: removeKeyInfo, ...rest } = oldState;
return rest;
});
};
}
注意点として、
type State = { [key: string]: number };
のように、
オブジェクトのkeyを明示的に型定義する必要があります。
型定義しないとコンパイルエラーになります。
処理内容としては、removeKey
をブラケットで囲み、削除したいプロパティ([removeKey]: removeSetKeyInfo
)を指定します。
後は、削除したいプロパティ以外(rest
)をreturnすることで、
単一のプロパティをオブジェクトから削除できます。
ちなみに、...rest
はスプレッド構文の残余構文を使用してます。
-
reduce
を使用し動的なkeyを使って、配列を配列風のオブジェクトに変換
useHook.ts
type InitlListToObj = { [key: string]: number };
const useHooks = () => {
const list = [1, 2, 3, 4, 5];
const listToObj = list.reduce((result, current) => {
result[current.key] = current.key;
return result;
}, {} as InitlListToObj);
}
// listToObj output {'1': 1, '2': 2, '3': 3, '4': 4, '5': 5}
こちらは、単純にreduce
を使ってるだけなのですが初期値に、
{} as InitlListToObj
を指定し、
2. と同様にtype InitlListToObj
で、オブジェクトのkeyを明示的に型定義する必要があります。
終わり。
Discussion