Javascript中的对象属性降序

问题描述

我正在用 Javascript 构建一个程序,它将字符串作为输入 (inputTextLower),计算每个单词的使用次数(类似于:http://www.writewords.org.uk/word_count.asp),然后显示HTML 表格中每个单词的频率。词频计数器工作正常,但结果不是按频率降序显示,而是按 inputTextLower 中的单词顺序显示。如何按频率对结果进行排序?这是要澄清的图像:

Example

这是我的文本频率函数以及我如何将结果输入表格:

let tableText = document.querySelector('table');
let inputTextLower = "This is a test test test sentence sentence".toLowerCase();

var pattern = /\w+/g,string = inputTextLower;
matchedWords = string.match(pattern);
var counts = matchedWords.reduce(function(stats,word) {
  if (stats.hasOwnProperty(word)) {
    stats[word] = stats[word] + 1;
  } else {
    stats[word] = 1;
  }
  return stats;
},{});

for (const word in counts) {
    if (counts[word] == 1) {
      tableText.innerHTML += `<tr><td>${word}</td><td>${counts[word]} time</td></tr>`;
    } else {
      tableText.innerHTML += `<tr><td>${word}</td><td>${counts[word]} times</td></tr>`;
    }
  }
<table></table>

解决方法

使用 Object.entries() 将对象转换为数组数组。然后可以对键/值对进行排序。

索引 0 是键,1 是值。所以对值进行排序。

这是根据值对数组进行排序的行:

let sortedCounts = Object.entries(counts).sort((a,b) => b[1] - a[1]);

然后,使用 array[0] 打印每个表条目的键和 array[1] 值:

let tableText = document.querySelector('table');
let inputTextLower = "This is a test test test sentence sentence".toLowerCase();

var pattern = /\w+/g,string = inputTextLower;
matchedWords = string.match(pattern);
var counts = matchedWords.reduce(function(stats,word) {
  if (stats.hasOwnProperty(word)) {
    stats[word] = stats[word] + 1;
  } else {
    stats[word] = 1;
  }
  return stats;
},{});

let sortedCounts = Object.entries(counts).sort((a,b) => b[1] - a[1]);


for (const count of sortedCounts) {
  if (count[1] == 1) {
    tableText.innerHTML += `<tr><td>${count[0]}</td><td>${count[1]} time</td></tr>`;
  } else {
    tableText.innerHTML += `<tr><td>${count[0]}</td><td>${count[1]} times</td></tr>`;
  }
}
<table></table>

,

这种方式,使用方法 Object.entries() 和 array.sort()

const
    tableText  = document.querySelector('table'),inputText  = "This is a test test test sentence sentence",pattern    = /\w+/g,counts     = inputText
                    .toLowerCase()
                    .match(pattern)
                    .reduce((stats,word) =>
      {
      stats[word] = (stats[word] || 0 ) + 1;
      return stats;
      },{})
      ;
Object.entries( counts )
      .sort((a,b)=>a[1]-b[1])
      .forEach( ([word,freq]) =>
  {
  let newRow = tableText.insertRow()
  newRow.insertCell().textContent = word
  newRow.insertCell().textContent = freq+' time'+((freq>1) ?'s':'')
  })
table  {
  border-collapse : collapse;
  margin          : 2em 1em;
  }
table td {
  padding    : .2em .8em;
  border     : 1px solid darkblue;
  }
<table></table>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...