Disons que j'ai un objet:
{
item1: { key: 'sdfd', value:'sdfd' },
item2: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Je veux créer un autre objet en filtrant l'objet ci-dessus donc j'ai quelque chose comme.
{
item1: { key: 'sdfd', value:'sdfd' },
item3: { key: 'sdfd', value:'sdfd' }
}
Je cherche un moyen propre d'accomplir cela en utilisant Es6, donc des opérateurs de diffusion sont à ma disposition.
filter
ecmascript-6
29er
la source
la source
Réponses:
Si vous avez une liste de valeurs autorisées, vous pouvez facilement les conserver dans un objet en utilisant:
Cela utilise:
Object.keys
pour répertorier toutes les propriétésraw
(les données d'origine), puisArray.prototype.filter
pour sélectionner les clés présentes dans la liste autorisée, en utilisantArray.prototype.includes
pour s'assurer qu'ils sont présentsArray.prototype.reduce
pour construire un nouvel objet avec uniquement les propriétés autorisées.Cela fera une copie superficielle avec les propriétés autorisées (mais ne copiera pas les propriétés elles-mêmes).
Vous pouvez également utiliser l'opérateur de répartition des objets pour créer une série d'objets sans les muter (merci à rjerue de l'avoir mentionné ):
Pour des questions triviales, si vous vouliez supprimer les champs indésirables des données d'origine (ce que je ne recommanderais pas de faire, car cela implique des mutations moches), vous pouvez inverser la
includes
vérification comme suit:J'inclus cet exemple pour montrer une solution basée sur la mutation, mais je ne suggère pas de l'utiliser.
la source
Array.prototype.includes
ne fait pas partie d'ES6. Il est introduit dans ECMAScript 2016 (ES7).Si vous êtes d'accord avec l'utilisation de la syntaxe ES6, je trouve que la façon la plus propre de le faire, comme indiqué ici et ici, est:
Maintenant,
newData
contient:Ou, si vous avez la clé stockée sous forme de chaîne:
Dans ce dernier cas,
[key]
est converti enitem2
mais puisque vous utilisez uneconst
affectation, vous devez spécifier un nom pour l'affectation._
représente une valeur à jeter.Plus généralement:
Non seulement cela réduit votre fonctionnement à un seul revêtement, mais cela ne vous oblige pas non plus à savoir quelles sont les autres clés (celles que vous souhaitez conserver).
la source
_
représente une valeur à jeter" d'où cela vient-il? Première fois que je le vois_
est simplement un nom de variable valide qui peut être utilisé dans JS mais comme il est à peu près sans nom, il ne devrait vraiment pas être utilisé de cette façon si vous souhaitez transmettre l'intention. Donc, il a été adopté comme un moyen de désigner une variable dont vous ne vous souciez pas. Voici d'autres discussions à ce sujet: stackoverflow.com/questions/11406823/…filter
etreduce
._
n'a pas d'importance, c'est juste un nom de variable, vous pouvez le renommer comme vous voulezomit
fonction de lodash : lodash.com/docs/4.17.10#omit ou l'une des autres solutions données ici.Le moyen le plus propre que vous pouvez trouver est avec Lodash # pick
la source
Rien de ce qui n'a pas été dit auparavant, mais pour combiner quelques réponses à une réponse générale ES6:
la source
Juste une autre solution dans une ligne de Modern JS sans bibliothèque externe .
Je jouais avec la fonction " Destructuration ":
la source
var myNewRaw = (({ item1, item3}) => ({ item1, item3 }))(raw);
Problème de syntaxeVous pouvez maintenant le rendre plus court et plus simple en utilisant la méthode Object.fromEntries (vérifiez la prise en charge du navigateur):
en savoir plus sur: Object.fromEntries
la source
Vous pouvez ajouter un générique
ofilter
(implémenté avec génériqueoreduce
) afin que vous puissiez facilement filtrer les objets de la même manière que vous pouvez les tableaux -Nous pouvons le voir fonctionner ici -
Vérifiez les résultats dans votre propre navigateur ci-dessous -
Afficher l'extrait de code
Ces deux fonctions pourraient être mises en œuvre de plusieurs façons. J'ai choisi de l'attacher à l'
Array.prototype.reduce
intérieuroreduce
mais vous pourriez tout aussi facilement tout écrire à partir de zérola source
oreduce
, le premieracc
est masqué.reduce(acc, k)
, et dansofilter
leo
est masqué -oreduce
est appelé avec une variable appeléeo
également - qui est lequel?ofilter
la variableo
est ombrée mais elle pointe toujours vers la même entrée var; c'est pourquoi il est masqué ici, car c'est la même chose - l'accumulateur (acc
) est également masqué car il montre plus clairement comment les données se déplacent via le lambda;acc
n'est pas toujours la même liaison , mais il représente toujours l' état persistant actuel du résultat de calcul que nous souhaitons retournerVoici comment je l'ai fait récemment:
la source
Object.assign == ...
Vous pourriez écrireconst dummyObj = { ...obj }
etconst target = { ...dummyObj }
. De plus, ce dernier n'est pas du tout nécessaire, car vous pourriez ensuite travailler directement avec dummyObj.ok, que diriez-vous de ce one-liner
la source
Les réponses ici sont certainement appropriées mais elles sont un peu lentes car elles nécessitent de parcourir la liste blanche pour chaque propriété de l'objet. La solution ci-dessous est beaucoup plus rapide pour les grands ensembles de données car elle ne boucle qu'une seule fois dans la liste blanche:
la source
Ferroutage sur la réponse de ssube .
Voici une version réutilisable.
Pour l'appeler, utilisez
La belle chose à propos des fonctions fléchées ES6 est que vous n'avez pas à passer en
allowed
paramètre.la source
Vous pouvez faire quelque chose comme ça:
Cela fonctionne mais n'est pas très clair, et la
with
déclaration n'est pas recommandée ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with ).la source
Une solution plus simple sans utilisation
filter
peut être obtenue avecObject.entries()
au lieu deObject.keys()
la source
Il y a plusieurs façons d'accomplir ceci. La réponse acceptée utilise une approche Keys-Filter-Reduce, qui n'est pas la plus performante.
Au lieu de cela, utiliser une
for...in
boucle pour parcourir les clés d'un objet, ou parcourir les clés autorisées, puis composer un nouvel objet est ~ 50% plus performant a .une. Voir jsPerf pour les repères d'un cas d'utilisation simple. Les résultats différeront en fonction des navigateurs.
la source
Vous pouvez supprimer une clé spécifique sur votre objet
la source
la source
Manière simple! Pour faire ça.
la source
Autre solution utilisant la "nouvelle"
Array.reduce
méthode:Démonstration dans ce violon ...
Mais j'aime la solution dans cette réponse ici qui utilise et :
Object.fromEntries
Array.filter
Array.includes
Démonstration dans ce violon ...
la source
OK, qu'en est-il:
et appelez-le comme ceci:
la source
Cette fonction filtrera un objet en fonction d'une liste de clés, c'est plus efficace que la réponse précédente car elle n'a pas besoin d'utiliser Array.filter avant d'appeler Reduce. donc son O (n) par opposition à O (n + filtré)
la source
Pendant la boucle, ne retournez rien lorsque certaines propriétés / clés sont rencontrées et continuez avec le reste:
la source
Je suis surpris que personne ne l'ait encore suggéré. C'est super propre et très explicite sur les clés que vous souhaitez conserver.
Ou si vous voulez une doublure sale:
la source
Une autre approche serait d'utiliser
Array.prototype.forEach()
commeIl inclut uniquement les valeurs des clés disponibles dans les données brutes et empêche ainsi l'ajout de données indésirables.
la source
Ce serait ma solution:
la source