Aqui está algo mais simples, embora não evite repetir a lista de campos. Ele usa "destruição de parâmetros" para evitar a necessidade do v
parâmetro.
({id, title}) => ({id, title})
(Veja um exemplo executável nesta outra resposta ).
A solução da @ EthanBrown é mais geral. Aqui está uma versão mais idiomática, que usa Object.assign
e calcula as propriedades (a [p]
parte):
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
Se queremos preservar os atributos das propriedades, como configurable
e getters e setters, além de omitir propriedades não enumeráveis, então:
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)})))
);
}
Object.assign
; ES6 é como uma árvore de Natal com tantos presentes sob ela ainda estou encontrando presentes meses após o feriado