如何按 JavaScript 中的值过滤字典?
How to filter a dictionary by value in JavaScript?
我正在编写一个脚本来创建一个名为 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>
您可以再次使用 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
不适用于 returning 从给定对象中选择 key/values 的对象。为此,您需要 _.pickBy
。
- 您的对象值没有
frecuency
属性;它们是原始值,所以你只需要 return user > 1
Lodash 代码:
var filtered = _.pickBy(dict, function(user) {
return user > 1;
});
我正在编写一个脚本来创建一个名为 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>
您可以再次使用 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
不适用于 returning 从给定对象中选择 key/values 的对象。为此,您需要_.pickBy
。- 您的对象值没有
frecuency
属性;它们是原始值,所以你只需要 returnuser > 1
Lodash 代码:
var filtered = _.pickBy(dict, function(user) {
return user > 1;
});