Aquí hay algo más delgado, aunque no evita repetir la lista de campos. Utiliza la "desestructuración de parámetros" para evitar la necesidad del v
parámetro.
({id, title}) => ({id, title})
(Vea un ejemplo ejecutable en esta otra respuesta ).
La solución de @ EthanBrown es más general. Aquí hay una versión más idiomática de la misma que usa Object.assign
propiedades calculadas (la [p]
parte):
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
Si queremos preservar los atributos de las propiedades, como configurable
y getters y setters, al tiempo que omitimos propiedades no enumerables, entonces:
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 es como un árbol de Navidad con tantos regalos debajo que todavía encuentro regalos meses después de las vacacionesfilter(...).map(prop => ({[prop]: get(prop)})))
?pick()
implementación, también podría hacer algo comoreturn props.reduce((r, prop) => (r[prop] = o[prop], r), {})
undefined
. A veces importa. Aparte de eso, buena idea.No creo que haya ninguna forma de hacerlo mucho más compacto que su respuesta (o la de torazburo), pero esencialmente lo que está tratando de hacer es emular la
pick
operación de Underscore . Sería bastante fácil volver a implementar eso en ES6:Entonces tiene una práctica función reutilizable:
fuente
pick
función una vez, y puede elegir tantas propiedades que desee y no las duplicará.hasOwnProperty
? Si los campos se seleccionan a mano, inclusoin
parece ser más apropiado; aunque me gustaría omitir el cheque por completo y simplemente dejarlos predeterminadosundefined
.El truco para resolver esto como una línea es cambiar el enfoque adoptado: en lugar de comenzar desde el objeto original
orig
, uno puede comenzar desde las teclas que desea extraer.El uso de
Array#reduce
uno puede almacenar cada clave necesaria en el objeto vacío que se pasa comoinitialValue
dicha función.Al igual que:
fuente
Una solución un poco más corta usando el operador de coma:
fuente
pick
funciones en este hilo:pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
La propuesta de propiedades de reposo / propagación de objetos de TC39 hará que esta bonita mancha:
(Tiene el inconveniente de crear las variables
x
yy
que puede que no necesite).fuente
omit
, pero nopick
let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
Puede utilizar la desestructuración de objetos para desempaquetar propiedades del objeto existente y asignarlas a variables con diferentes nombres : campos de un nuevo objeto inicialmente vacío.
fuente
ES6 era la última especificación en el momento en que se escribió la pregunta. Como se explica en esta respuesta , la selección de claves es significativamente más corta en ES2019 que en ES6:
fuente
Actualmente hay una propuesta de Strawman para mejorar la sintaxis abreviada de objetos de JavaScript, que permitiría "seleccionar" propiedades con nombre sin repetición:
Desafortunadamente, la propuesta no parece ir a ningún lado pronto. Editado por última vez en julio de 2017 y todavía un borrador en la Etapa 0 , lo que sugiere que el autor puede haberlo abandonado o olvidado.
ES5 y versiones anteriores (modo no estricto)
La taquigrafía más concisa posible que se me ocurre implica una característica del lenguaje antiguo que ya nadie usa:
with
las declaraciones están prohibidas en modo estricto, lo que hace que este enfoque sea inútil para el 99.999% de JavaScript moderno. Es una pena, porque este es el único uso medio decente que he encontrado para lawith
función. 😀fuente
Tengo una solución similar a la de Ethan Brown, pero aún más corta
pick
. Otra funciónpick2
es un poco más larga (y más lenta), pero permite cambiar el nombre de las propiedades de manera similar a ES6.Aquí está el ejemplo de uso:
fuente
Requerí esta solución, pero no sabía si las claves propuestas estaban disponibles. Entonces, tomé la respuesta de @torazaburo y mejoré para mi caso de uso:
fuente
inspirado en el enfoque reducido de https://stackoverflow.com/users/865693/shesek :
uso:
pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear')
resultados en:{model: "F40", productionYear: 1987}
fuente