我想用node.js计算字符串的出现次数,并开始实现如下的字典:
var dict = {}
// Example content ("string" = count)
dict["alpha"] = 12
dict["beta"] = 39
// Increment count (working)
dict["alpha"]++
但是,如何从最高到最低计数对此词典进行排序?有没有内置排序或我必须自己实现这个?
我想列出文件中从最高到最低计数的输出,每行为:
<count> <string>
答案 0 :(得分:3)
对象是无序的,因为密钥是根据哈希值存储的。所以,没有一种叫做排序对象的东西。
但是,您只需根据count
对键进行排序,然后直接在其上应用forEach
,就像这样
> Object.keys(dict).sort(function(key1, key2) {
... return dict[key2] - dict[key1];
... }).forEach(function(currentKey) {
... console.log(currentKey, dict[currentKey]);
... });
beta 39
alpha 12
要理解这一点,您可以逐步将对象转换为对数组,如此
> var dict = {}
undefined
> dict["alpha"] = 12
12
> dict["beta"] = 39
39
> var temp = Object.keys(dict).map(function(currentKey) {
... return [currentKey, dict[currentKey]];
... });
undefined
> temp
[ [ 'alpha', 12 ],
[ 'beta', 39 ] ]
然后根据第二个元素对Array.prototype.sort
进行排序,就像这个
> temp.sort(function(pair1, pair2) {
... return pair2[1] - pair1[1];
... });
[ [ 'beta', 39 ],
[ 'alpha', 12 ] ]
然后按照您喜欢的方式打印它们,就像这样
> temp.forEach(function(currentPair) {
... console.log(currentPair[0], currentPair[1]);
... })
beta 39
alpha 12
由于您想将结果写入文件,您可以这样做
> var fileWriter = require("fs").createWriteStream('Output.txt');
undefined
> Object.keys(dict).sort(function (key1, key2) {
... return dict[key2] - dict[key1];
... }).forEach(function (currentKey) {
... fileWriter.write(currentKey + " " + dict[currentKey] + "\n");
... });
undefined
> fileWriter.end();
undefined
> require("fs").readFileSync("Output.txt").toString()
'beta 39\nalpha 12\n'
您可能需要浏览this amazing answer,以便更好地了解如何在JavaScript中完成排序。
答案 1 :(得分:2)
继续Rob的回答,你可以得到具有如下值的对象的排序数组:
var res = Object.keys(dict).map(function(key ) {
return { key: key, value : dict[key] };
}).sort(function(a, b) {
return b.value - a.value
});
其中res是对形式[{key:“alpha”,value:16},...]
的数组进行排序然后可以使用reduce
将其转换为字符串var strToFile = res.reduce( function(p,n) {
return p + n.value+" "+n.key+"\n"; },"");
结果类似于
39 beta
12 alpha
答案 2 :(得分:0)
你可以获得最常出现的单词数组(尽管你没有数组中的值);
Object.keys(dict).sort(function(a, b) {
return dict[b]-dict[a];
});
// ["beta", "alpha"]