ES6 で最もコンパクトな方法で、少数の属性のみを取る関数を書くにはどうすればよいでしょうか?
構造化分解と簡略化されたオブジェクトリテラルを使用した解決策を思いつきましたが、コード内でフィールドのリストが繰り返されるのは気に入りません。
さらにスリムな解決策はありますか?
(v) => {
let { id, title } = v;
return { id, title };
}
ベストアンサー1
これはよりスリムなものです。ただし、フィールドのリストが繰り返されることは避けられません。パラメータの必要性を回避するために、「パラメータ分解」を使用しますv
。
({id, title}) => ({id, title})
(実行可能な例はこちらその他の回答)。
Object.assign
@EthanBrown のソリューションはより一般的です。以下は、、および計算プロパティ ([p]
の部分)を使用する、より慣用的なバージョンです。
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
configurable
列挙不可能なプロパティを省略しながら、ゲッターやセッターなどのプロパティの属性を保持したい場合は、次のようにします。
function pick(o, ...props) {
var has = p => o.propertyIsEnumerable(p),
get = p => Object.getOwnPropertyDescriptor(o, p);
return Object.defineProperties({},
Object.assign({}, ...props
.filter(prop => has(prop))
.map(prop => ({prop: get(props)})))
);
}