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
を使えばいいのですが、それでは値が残ってしまうのでこのように取り除くメソッドを用意しました。もう少し綺麗に書ける方法があるといいんですが……