Javascript中的对象属性降序

如何解决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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?