如何在对象中订购商品?

时间:2015-05-08 20:10:20

标签: javascript node.js sorting object

我想用node.js计算字符串的出现次数,并开始实现如下的字典:

var dict = {}

// Example content ("string" = count)
dict["alpha"] = 12
dict["beta"] = 39

// Increment count (working)
dict["alpha"]++

但是,如何从最高到最低计数对此词典进行排序?有没有内置排序或我必须自己实现这个?

我想列出文件中从最高到最低计数的输出,每行为:

<count> <string>

3 个答案:

答案 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"]