对象 属性 降序 Javascript

Object property descending order in Javascript

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

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

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()将对象转换为数组的数组。然后可以对 key/value 对进行排序。

索引 0 是键,1 是值。所以按值排序。

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

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

然后,使用 array[0] 打印每个 table 条目的键和 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>