如何在JavaScript中按值过滤字典?

neo*_*o33 13 html javascript lodash

我正在编写一个脚本来创建一个名为dict的字典,其中我存储了文本区域中某些单词的频率.我的数组看起来像这样:

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

我想根据它们的值过滤这个字典的元素.我需要创建一个列表,其中包含值大于1的单词.我的字典看起来像这样:

{
    "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
}
Run Code Online (Sandbox Code Playgroud)

为了实现我尝试使用lodash,如下:

var filtered = _.find(dict, function(user) {
    return user.frecuency > 1;
});
Run Code Online (Sandbox Code Playgroud)

但是自从我得到以后我失败了:

undefined
Run Code Online (Sandbox Code Playgroud)

我不知道如何适当地使用lodash来过滤这个数组.

我的完整代码如下所示:

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)
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

tri*_*cot 24

您可以reduce再次使用以在纯JavaScript中实现:

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

使用一些ES6功能,例如箭头功能,传播语法Object.entries,......它可能如下所示:

var filtered = Object.assign({}, ...
    Object.entries(dict).filter(([k,v]) => v>1).map(([k,v]) => ({[k]:v}))
);
Run Code Online (Sandbox Code Playgroud)

使用Lodash

您尝试使用lodash时遇到了一些问题:

  • Object.fromEntries不用于返回从给定对象中选择键/值的对象.你需要_.find那个.
  • 您的对象值没有_.pickBy属性; 它们是原始值,所以你应该只需返回frecuency

Lodash代码:

var filtered = Object.fromEntries(Object.entries(dict).filter(([k,v]) => v>1));
Run Code Online (Sandbox Code Playgroud)