2016-06-03 27 views
5

Piszę skrypt, aby utworzyć słownik o nazwie Dict, w którym przechowuje częstotliwości niektórych słów, które mam w obszarze tekstowym. Moja tablica wygląda następująco:Jak filtrować słownik według wartości w JavaScript?

var dict = removeArray.reduce(function(p,c) { 
    if (p[c] === undefined) { 
     p[c] = 1; 
    } else { 
     p[c]++; 
    } 
    return p; 
}, {}); 

Chciałbym przefiltrować elementy tego słownika według ich wartości. Potrzebuję utworzyć listę ze słowami, które mają wartość większą niż jeden. Mój słownik wygląda następująco:

{ 
    "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 
} 

W celu osiągnięcia tego Próbowałem za pomocą lodash, co następuje:

var filtered = _.find(dict, function(user) { 
    return user.frecuency > 1; 
}); 

Ale nie udało mi się, ponieważ mam:

undefined 

I don” t wiedzieć, jak używać lodash odpowiednio, aby filtrować tę tablicę.

mój pełny kod wygląda następująco:

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>

+0

underscore.js -> spróbować, może uczynić życie prostszym –

Odpowiedz

8

Można użyć reduce ponownie, aby osiągnąć w zwykły JavaScript:

var filtered = Object.keys(dict).reduce(function (filtered, key) { 
    if (dict[key] > 1) filtered[key] = dict[key]; 
    return filtered; 
}, {}); 

Było kilka problemów z próba z użyciem:

  • _.find nie jest przeznaczony do zwracania obiektu, który pobiera wybrane klucze/wartości z danego obiektu. Do tego potrzebowałbyś _.pickBy.
  • Twoje wartości obiektów nie mają właściwości frecuency; Wartości są prymitywne, więc należy po prostu musiał wrócić user > 1

kod Lodash:

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

Dzięki to był bardzo pomocny, Naprawdę doceniam wsparcie. – neo33

Powiązane problemy