JavaScript | 既存の配列返却関数を自動的にオブジェクト返却にラップして一括変換するテンプレート関数

JavaScript JavaScript
スポンサーリンク

では次は 既存の配列返却関数を自動的にオブジェクト返却にラップして一括変換するテンプレート関数 を作ります。
これを使えば、チームで複数の関数を簡単にリファクタリングできます。


1. 自動ラップ関数テンプレート

/**
 * wrapArrayToObject
 * 配列返却関数をオブジェクト返却に変換する
 * 
 * @param {Function} fn - 配列を返す元の関数
 * @param {Array} keys - 配列の各要素に対応するキー名
 * @returns {Function} - オブジェクト返却関数
 */
function wrapArrayToObject(fn, keys) {
  return function (...args) {
    const arr = fn(...args); // 元関数を呼ぶ
    if (!Array.isArray(arr)) {
      throw new Error("元関数が配列を返していません");
    }
    const obj = {};
    keys.forEach((key, index) => {
      obj[key] = arr[index];
    });
    return obj;
  };
}
JavaScript

2. 既存関数の例

function calcStats(values) {
  const sum = values.reduce((a, b) => a + b, 0);
  const avg = sum / values.length;
  const max = Math.max(...values);
  const min = Math.min(...values);
  return [sum, avg, max, min]; // 配列で返す
}

function getUserScores(user) {
  const math = user.math;
  const english = user.english;
  const science = user.science;
  const total = math + english + science;
  return [math, english, science, total]; // 配列で返す
}
JavaScript

3. ラップしてオブジェクト返却に変換

const calcStatsObj = wrapArrayToObject(calcStats, ["sum", "avg", "max", "min"]);
const getUserScoresObj = wrapArrayToObject(getUserScores, ["math", "english", "science", "total"]);
JavaScript

4. 呼び出し側例

const stats = calcStatsObj([10, 20, 30]);
console.log(stats.sum, stats.avg, stats.max, stats.min); // 60 20 30 10

const user = { math: 80, english: 70, science: 90 };
const scores = getUserScoresObj(user);
console.log(scores.math, scores.english, scores.science, scores.total); // 80 70 90 240
JavaScript

5. メリット(実務視点)

  1. 既存の配列返却関数を壊さずに変換
    • 元関数はそのまま残せるので、テストコードや他箇所との互換性も維持可能。
  2. 簡単にオブジェクト返却に統一
    • 配列返却関数が多くても、このテンプレートでラップするだけ。
  3. 呼び出し側が直感的
    • stats.sum のように意味のある名前でアクセスできる。
  4. APIラップやチーム開発で安全
    • 順序ミスや保守性の問題を一気に解消。

💡 応用例

  • APIレスポンス用にラップしたい場合:
function getStatsApi(values) {
  return { success: true, data: calcStatsObj(values), errors: [] };
}
JavaScript
  • チームで大量の関数をリファクタリングするときは、元関数名とキー配列をまとめた設定リストを作り、一括で wrapArrayToObject を適用可能。
タイトルとURLをコピーしました