2016-10-11 64 views
0

所以我创建了这个JS代码来得到一个地图,其中字符串中的每个单词都是关键字,而单词出现的次数就是这个值。是否有一个简单的方法来获取JavaScript对象中所有键的属性?

var txtArray = txtVar.split(" "); 
var txtMap = {}; 
for (var i = 0; i<txtArray.length;i++){ 
    if(txtArray[i] in txtMap) 
    txtMap[txtArray[i]] += 1; 
    else 
    txtMap[txtArray[i]] = 1; 
} 

现在我需要对它们进行排序,这样我可以以某种方式由10个最长的单词和10个最常用的词对他们进行排名等等,我想我可以找到一种方法,通过使一个for循环在何处执行我将它们存储在数组中,然后在新列表出现时将最老的“顶部”单词放在列表的上面或下面,但是我认为这样做一定不那么尴尬?

+0

'Obje ct.keys(txtMap).sort((a,b)=> txtMap [a] txtMap [b]? +1:0)'。 – 2016-10-11 04:43:44

+0

请注意,* in *也会检查原型链,因此'txtMap [txtArray [i]] + = 1'可能会在明显随机且难以找到的情况下产生意想不到的结果。 – RobG

回答

2

这也可能是适当的做法按你现在的方式做,然后在完成时对结果进行排序/切片:

var allWords = Object.keys(txtMap); 
var tenMostFrequent = allWords 
    .sort((a, b) => txtMap[b] - txtMap[a]) 
    .slice(0, 10); 
var longestWords = allWords 
    .sort((a, b) => b.length - a.length) 
    .slice(0, 10); 
0

您可以使用Object.keys(),你认为合适得到的单词的数组,然后.sort()并使用.slice()获得前10名:

var txtVar = "some sample input to have something to fill the array with - random words the in are the it the what with some random whatever what what ridiculous whatever hello goodbye words the to have"; 
 

 
var txtArray = txtVar.split(" "); 
 
var txtMap = {}; 
 
for (var i = 0; i<txtArray.length;i++){ 
 
    if(txtArray[i] in txtMap) 
 
    txtMap[txtArray[i]] += 1; 
 
    else 
 
    txtMap[txtArray[i]] = 1; 
 
} 
 

 
var tenLongest = Object.keys(txtMap).sort(function(a, b) { 
 
    return b.length - a.length; 
 
    }).slice(0, 10); 
 
console.log("Longest: ", tenLongest.join(", ")); 
 

 
var tenMostUsed = Object.keys(txtMap).sort(function(a, b) { 
 
    return txtMap[b] - txtMap[a]; 
 
    }).slice(0, 10) 
 
    .map(function(v) { return v + " (" + txtMap[v] + ")"; }); 
 
console.log("Most used: ", tenMostUsed.join(", "));

相关问题