web-dev-qa-db-fra.com

Comment filtrer un dictionnaire par valeur en JavaScript?

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>
17
neo33

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));

Utiliser Lodash

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.
  • Vos valeurs d'objet n'ont pas de propriété frecuency; ce sont des valeurs primitives, vous devez donc simplement renvoyer user > 1

Code Lodash:

var filtered = _.pickBy(dict, function(user) {
  return user > 1;
});
21
trincot