ネストしているObjectを削除して新しいObjectを作成する

Task

2019年08月06日 18:00

Laravel では Request に連想配列が含まれているとエラーが発生するため、exceptを使って任意の連想配列を取り除くことができます。

ただこれは Request 型にあるメソッドなので、$request->user->except(['skills'])のように、ネストされている連想配列に対して処理しようとするとエラーが発生します。

PHP 側で取り除くのが一番ですが、JavaScript を使ってクライアント側でもネストされた Object を取り除くことができます。

removeNesting(obj) {
  return Object.entries(obj).reduce((acc, [key, val]) => {
    if ("object" === typeof val) {
      return acc;
    }
    acc[key] = val;
    return acc;
  }, {});
}

Array 型で任意の value を除去したり、変更を加える場合はfilter()map()を使えばいいのですが、Object 型ではfilter()map()ではうまく処理ができない(?)ため、reduce()を使います。

reduce()は本来配列の値を 1 つの値として利用するとき(配列の値を全て足すなど)に使われますが、初期値を Object 型や Array 型にするとfilter()map()のような使い方も可能です。

今回は初期値に空の Object を与え、処理を繰り返します。value の型が object であった時は Object に新しい値を加えずに返し、それ以外の場合は元の key と value をセットして返します。

多次元配列を 1 次元にするだけであればflatを使えばいいのですが、それでは値が残ってしまうのでこのように取り除くメソッドを用意しました。もう少し綺麗に書ける方法があるといいんですが……

p { margin-bottom: 1em; } blockquote p { margin-bottom: initial; } #content ul { padding-left: 40px; } .token.operator { background-color: initial; }

関連記事