对象 属性 降序 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>
我正在 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>