One-liner à prendre certaines propriétés de l'objet dans l'ES 6
Comment on peut écrire une fonction qui ne prend que quelques attributs en plus et de façon compacte dans l'ES6?
Je suis venu avec la solution à l'aide de déstructuration + simplifiée littéral d'objet, mais je n'aime pas que la liste des champs est répété dans le code.
Est-il encore moins de solution?
(v) => {
let { id, title } = v;
return { id, title };
}
OriginalL'auteur kirilloid | 2014-08-28
Vous devez vous connecter pour publier un commentaire.
Voici quelque chose de plus fin, bien qu'il n'est pas d'éviter de répéter la liste de champs. Elle utilise le paramètre "déstructuration" pour éviter la nécessité pour le
v
paramètre.@EthanBrown la solution est plus général. Ici, c'est un plus idiomatiques version qui utilise
Object.assign
, et les propriétés calculées (la[p]
partie):Si nous voulons préserver les propriétés des attributs, tels que
configurable
et des getters et setters, tout en omettant non énumérable propriétés, puis:Object.assign
; es6 est comme un arbre de Noël avec de nombreux cadeaux sous, je suis toujours à trouver des cadeaux mois après les vacancesVous avez une erreur: description de la Propriété doit être un objet: non défini. Ne devrait-elle pas être
filter(...).map(prop => ({[prop]: get(prop)})))
?Pour votre première
pick()
mise en œuvre vous pouvez aussi faire quelque chose commereturn props.reduce((r, prop) => (r[prop] = o[prop], r), {})
malheureusement, cette version de choisir de ne pas être sécurisé dans le flux ou tapuscrit. si vous voulez le type de sécurité, il n'y a pas moyen de contourner se déstructurent l'affectation de l'objet d'origine, puis en attribuant à chacun dans un nouvel objet.
Lorsqu'une propriété n'existe pas dans un objet, vous obtenez
undefined
. Parfois, c'est important. Autre que cela, belle idée.OriginalL'auteur
Je ne pense pas qu'il y a moyen de faire beaucoup plus compact que votre réponse (ou torazburo), mais essentiellement, ce que vous essayez de faire est d'imiter Trait de soulignement
choisir
fonctionnement. Il serait assez facile de re-mettre en œuvre que dans l'ES6:Alors vous avez une pratique ré-utilisable de la fonction:
(haussement d'épaules), je sens que c' est une réponse de votre solution; il n'est pas plus mince général solution (torazaburo la solution supprime extra verbage, mais le problème essentiel -- que tous les noms de propriété doivent être écrit deux fois -- dire qu'il n'a pas d'échelle de mieux que de votre solution). Ma solution au moins échelles...droit de la
pick
fonction qu'une seule fois, et vous pouvez choisir autant de propriétés que vous voulez et il ne double pas.Pourquoi utilisez-vous
hasOwnProperty
? Si les champs sont sélectionnés à la main, mêmein
semble être plus approprié, bien que j'irais pour l'omission de la vérifier complètement et laisser par défaut pourundefined
.Bergi, c'est un point raisonnable...je viens de considérer les propriétés (pas de méthodes) sur un prototype de chaîne à être bizarre et "odorante" (comme dans ils sont une odeur de code), et je préfère les filtrer par défaut. Si il y a une application qui doit propriétés du prototype, eh bien...il y a peut être une option pour ça.
qu'en json tableaux !
OriginalL'auteur Ethan Brown
Un tout petit peu plus courte solution à l'aide de l'opérateur virgule:
Il fonctionne exactement comme les autres
pick
fonctions dans ce fil:pick({ name: 'John', age: 29, height: 198 }, 'name', 'age')
OriginalL'auteur shesek
TC39 de l'objet au repos et à la propagation des propriétés de proposition fera cette jolie nappe:
(Elle a l'inconvénient de la création de la
x
ety
variables qui vous ne pouvez pas besoin.)omit
, mais paspick
J'aimerais voir une variante qui fait exactement le contraire de ce ES proposition:
let { a, b } as z = { x: 1, y: 2, a: 3, b: 4 }
OriginalL'auteur alxndr
J'ai similaires à Ethan Brown est une solution, mais même à court
pick
fonction. Une autre fonctionpick2
est un peu plus long (et plus lent), mais permet de renommer propriétés similaires à l'ES6.Voici l'exemple d'utilisation:
OriginalL'auteur Alexandr Priezzhev
J'ai besoin, cette solution mais je ne savait pas si les touches étaient disponibles. Donc, j'ai pris @torazaburo réponse et amélioré pour mon cas d'utilisation:
OriginalL'auteur Alwin Kesler