Kuzunoha-NEのブログ

プログラミングなどの勉強をしてます

【Typescript】ネストなObjectが持つ文字列の全ての長さを整える

こんばんは葛の葉です。

ネストになっているオブジェクトを処理しようとすることが多くて、そのネストの深さがものによってまちまちな場合の処理書くの辛いなぁっている昨今なんですよ。色々と考えたら、これは再起処理でコードを書くのがいいんじゃないかなぁと思って今回書いてみました。

再起処理でobjectかそうでないかを判断する。

reflexiveFuncToObjectという関数を作成しました。これは第一引数に対象となるオブジェクトを入れ、第二引数にそのオブジェクトに実行させたい関数を入れます。第三引数以降はその関数に与える引数になります。この関数を実行するとオブジェクトのそれぞれのプロパティのデータ型がObjectかそうでないかを判定し、Objectの場合は再びreflexiveFuncToObject関数を実行し、そうでない場合は第二引数の関数を実行します。

interface anyObj {
  [key: string]: any;
}

const reflexiveFuncToObject = (obj: anyObj, func: Function, ...args: any) => {
  const copy:anyObj = {...{}, ...obj};
  Object.keys(copy).forEach((key: string) => {
    if (typeof copy[key] === "object") {
      reflexiveFuncToObject(copy[key], func, ...args);
    } else {
      copy[key] = func(copy[key], ...args);
    }
  });
  return copy;
};

以下のような値を変更するような関数を作ります。reflexiveFuncToObject関数の第一引数に入れてあげるようにします。

const truncate = (prop:any, l: number) => {
  if (typeof prop !== "string")  return prop;
  return l >= prop.length ? prop : (prop.substr(0, l) + "...");
};

const add = (prop: any, num: number) => {
  if (typeof prop !== "number") return prop;
  return prop + num;
};

以下の状況においてはこのようになります。

const object1 = {
  a: "aaaaa",
  b: "bbbbb",
  c: 1,
};
console.log(reflexiveFuncToObject(object1, truncate, 1)); // { a: 'a...', b: 'b...', c: 1 }
console.log(reflexiveFuncToObject(object1, add, 1)); // { a: 'aaaaa', b: 'bbbbb', c: 2 }

再起処理って初めて書いたかも

2年この仕事してるんだけど再起処理は初めて書いたかもしれない。今回再起処理を書いてみようと思ったのはチャレンジ心だけなんだ。もっといい処理の仕方は絶対あると思うけど、ネストなオブジェクトに対して再起処理はいいアプローチだと思っている。今後もチャレンジしてみたい。

最初はしょぼくたっていいんだ。後からかっこよくすりゃいいんだ。

追伸

次回以降は不定期に気まぐれに更新します。