Voici quelque chose de plus mince, même si cela n'évite pas de répéter la liste des champs. Il utilise la «déstructuration des paramètres» pour éviter le besoin du v
paramètre.
({id, title}) => ({id, title})
(Voir un exemple exécutable dans cette autre réponse ).
La solution de @ EthanBrown est plus générale. En voici une version plus idiomatique qui utilise Object.assign
et calcule des propriétés (la [p]
partie):
function pick(o, ...props) {
return Object.assign({}, ...props.map(prop => ({[prop]: o[prop]})));
}
Si nous voulons conserver les attributs des propriétés, tels que configurable
et les getters et les setters, tout en omettant également les propriétés non énumérables, alors:
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 est comme un sapin de Noël avec tant de cadeaux en dessous Je trouve encore des cadeaux des mois après les vacancesfilter(...).map(prop => ({[prop]: get(prop)})))
?pick()
implémentation, vous pouvez également faire quelque chose commereturn props.reduce((r, prop) => (r[prop] = o[prop], r), {})
undefined
. Parfois ça compte. A part ça, bonne idée.Je ne pense pas qu'il y ait un moyen de le rendre beaucoup plus compact que votre réponse (ou celle de torazburo), mais essentiellement ce que vous essayez de faire est d'imiter le
pick
fonctionnement de Underscore . Il serait assez facile de réimplémenter cela dans ES6:Ensuite, vous avez une fonction réutilisable pratique:
la source
pick
une fois la fonction correcte , et vous pouvez choisir autant de propriétés que vous voulez et cela ne les doublera pas.hasOwnProperty
? Si les champs sont sélectionnés à la main, celain
semble même être plus approprié; même si j'irais pour omettre complètement le chèque et les laisser par défautundefined
.L'astuce pour résoudre ce problème en une seule ligne est d'inverser l'approche adoptée: au lieu de partir de l'objet d'origine
orig
, on peut partir des clés qu'ils veulent extraire.En utilisant
Array#reduce
on peut alors stocker chaque clé nécessaire sur l'objet vide qui est passé en tant queinitialValue
pour ladite fonction.Ainsi:
la source
Une solution un peu plus courte utilisant l'opérateur virgule:
la source
pick
fonctions de ce fil:pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
La proposition de propriétés de repos / propagation d'objet de TC39 rendra cette jolie astuce:
(Cela présente l'inconvénient de créer les variables
x
ety
dont vous n'avez peut-être pas besoin.)la source
omit
, mais paspick
let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
Vous pouvez utiliser la déstructuration d'objets pour décompresser les propriétés de l'objet existant et les affecter à des variables avec des noms différents - des champs d'un nouvel objet initialement vide.
la source
ES6 était la dernière spécification au moment où la question a été écrite. Comme expliqué dans cette réponse , la sélection des clés est nettement plus courte dans ES2019 que dans ES6:
la source
Il existe actuellement une proposition de paille pour améliorer la syntaxe abrégée des objets JavaScript, qui permettrait de "sélectionner" les propriétés nommées sans répétition:
Malheureusement, la proposition ne semble pas aller nulle part de si tôt. Dernière modification en juillet 2017 et toujours un brouillon à l' étape 0 , suggérant que l'auteur l'a peut-être abandonné ou oublié.
ES5 et versions antérieures (mode non strict)
Le raccourci le plus concis possible auquel je puisse penser implique une fonctionnalité de langue ancienne que personne n'utilise plus:
with
les instructions sont interdites en mode strict, ce qui rend cette approche inutile pour 99,999% du JavaScript moderne. Un peu dommage, car c'est la seule utilisation à moitié décente que j'ai trouvée pour lawith
fonctionnalité. 😀la source
J'ai similaire à la solution d'Ethan Brown, mais encore plus courte -
pick
fonction. Une autre fonctionpick2
est un peu plus longue (et plus lente), mais permet de renommer les propriétés de la même manière que ES6.Voici l'exemple d'utilisation:
la source
J'avais besoin de cette solution mais je ne savais pas si les clés proposées étaient disponibles. Donc, j'ai pris la réponse @torazaburo et je me suis amélioré pour mon cas d'utilisation:
la source
inspiré de l'approche de réduction de https://stackoverflow.com/users/865693/shesek :
usage:
pick({ model : 'F40', manufacturer: 'Ferrari', productionYear: 1987 }, 'model', 'productionYear')
résulte en:{model: "F40", productionYear: 1987}
la source