【问题标题】:How to filter a dictionary by value in JavaScript?如何在 JavaScript 中按值过滤字典?
【发布时间】:2016-06-03 12:59:36
【问题描述】:

我正在编写一个脚本来创建一个名为 dict 的字典,我在其中存储我在文本区域中拥有的一些单词的频率。我的数组如下所示:

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

我想按值过滤这本字典的元素。我需要创建一个包含值大于 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
}

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

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

但我失败了,因为我得到了:

undefined

我不知道如何适当地使用 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)
<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>

【问题讨论】:

    标签: javascript html lodash


    【解决方案1】:

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

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

    借助一些 ES6 特性,例如箭头函数、展开语法、Object.entries,......它可以看起来像这样:

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

    或使用较新的Object.fromEntries

    var filtered = Object.fromEntries(Object.entries(dict).filter(([k,v]) => v>1));
    

    使用 Lodash

    您使用 lodash 的尝试存在一些问题:

    • _.find 不适用于返回从给定对象中选择键/值的对象。为此,您需要 _.pickBy
    • 您的对象值没有frecuency 属性;它们是原始值,因此您只需返回 user &gt; 1

    Lodash 代码:

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

    【讨论】:

    • 谢谢@trincot。使用标准 ES 2015 的好方法
    猜你喜欢
    • 1970-01-01
    • 2018-08-24
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2012-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多