要旨
オブジェクト初期化で条件によってプロパティを省略したい場合は以下のように書ける。
function sample(foo, bar, baz) {
return {
...foo ? { foo } : {},
...bar ? { bar } : {},
...baz ? { baz } : {},
};
}
console.log(sample('hoge')) // { foo: 'hoge' }
console.log(sample('hoge', 'fuga', 'piyo')) // { foo: 'hoge', bar: 'fuga', baz: 'piyo' }
三項演算子の結果をスプレット構文で戻り値となるオブジェクトに展開している。
補遺
なお、以下の実装と得られる結果は同じである。
function sample(foo, bar, baz) {
const obj = new Object();
if (foo) obj.foo = foo;
if (bar) obj.bar = bar;
if (baz) obj.baz = baz;
return obj;
}
だが、この実装には個人的に次のような不満があった。
- ワンライナーではない
- オブジェクト初期化後にプロパティを書き換えている