J'écris un script pour créer un dictionnaire appelé dict, où je stocke les fréquences de certains mots que j'ai dans une zone de texte. Mon tableau ressemble à ceci:
var dict = removeArray.reduce(function(p,c) {
if (p[c] === undefined) {
p[c] = 1;
} else {
p[c]++;
}
return p;
}, {});
Je voudrais filtrer les éléments de ce dictionnaire par leur valeur. J'ai besoin de créer une liste avec les mots qui ont une valeur supérieure à un. Mon dictionnaire ressemble à ceci:
{
"92173": 6,
"C": 6,
"GJHGWO.NAYE": 1,
"GJHGX4.NAYE": 1,
"GJHGX6.NAYE": 1,
"GJHGX8.NAYE": 1,
"GJHGXA.NAYE": 1,
"GJHGXC.NAYE": 1,
"RBD": 10,
"RBD3": 2,
"SAMBORNSiPOSSSTHRa": 2,
"SAMBORNSiPOSSSTHRa1": 2,
"SAMBORNSiPOSSSTHRa2": 2,
"X": 4,
"X3": 2
}
Pour y parvenir, j'ai essayé d'utiliser lodash, comme suit:
var filtered = _.find(dict, function(user) {
return user.frecuency > 1;
});
Mais j'ai échoué depuis que j'ai:
undefined
Je ne sais pas comment utiliser lodash de manière appropriée pour filtrer ce tableau.
Mon code complet ressemble à ceci:
var splitWords = document.getElementById("texto").value.split(/[["\|~]/);
var removeArray = _.remove(splitWords, function (Word) {
return Word !== '' && Word !== ' ' && Word !== '\n'
});
var dict = removeArray.reduce(function(p,c) {
if (p[c] === undefined) {
p[c] = 1;
} else {
p[c]++;
}
return p;
}, {});
console.log(dict);
var filtered = _.find(dict, function(user) {
return user.frecuency > 1;
});
console.log(filtered)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<p id="demo"></p>
<textarea cols="150" rows="15" id="texto">
"RBD|X|RBD3|C|92173~GJHGWO.NAYE"
"SAMBORNSiPOSSSTHRa1"
"RBD|X|RBD|C|92173~GJHGX4.NAYE"
"SAMBORNSiPOSSSTHRa"
"RBD|X3|RBD3|C|92173~GJHGX6.NAYE"
"SAMBORNSiPOSSSTHRa1"
"RBD|X|RBD|C|92173~GJHGX8.NAYE"
"SAMBORNSiPOSSSTHRa2"
"RBD|X|RBD|C|92173~GJHGXA.NAYE"
"SAMBORNSiPOSSSTHRa2"
"RBD|X3|RBD|C|92173~GJHGXC.NAYE"
"SAMBORNSiPOSSSTHRa"
</textarea>
Vous pouvez utiliser à nouveau reduce
pour y parvenir en JavaScript simple:
var filtered = Object.keys(dict).reduce(function (filtered, key) {
if (dict[key] > 1) filtered[key] = dict[key];
return filtered;
}, {});
Avec certaines fonctionnalités ES6, telles que les fonctions fléchées, la syntaxe étendue, Object.entries
, ... cela peut ressembler à ceci:
var filtered = Object.assign({}, ...
Object.entries(dict).filter(([k,v]) => v>1).map(([k,v]) => ({[k]:v}))
);
Ou en utilisant le plus récent Object.fromEntries
:
var filtered = Object.fromEntries(Object.entries(dict).filter(([k,v]) => v>1));
Il y a eu quelques problèmes avec votre tentative avec lodash:
_.find
n'est pas destiné à renvoyer un objet qui prend une sélection de clés/valeurs d'un objet donné. Vous auriez besoin de _.pickBy
pour ça.frecuency
; ce sont des valeurs primitives, vous devez donc simplement renvoyer user > 1
Code Lodash:
var filtered = _.pickBy(dict, function(user) {
return user > 1;
});