2016-10-11 3 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個ので最も使われる単語とすることによって、それらをランク付けすることができるようにそれらをソートする必要があると私はどこのループを作ることによってそれを行うための方法を見つけることができると思います私はそれらを配列に格納し、新しいものが来たときにリストの中で最も古い「トップ」の単語をプッシュしましたが、この作業を行うにはそれほど厄介な方法はないと思いますか?

+0

'Obje ct.keys(txtMap).sort((a、b)=> txtMap [a] txtMap [b]? +1:0) 'となる。 –

+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

あなたが合うよう.sort()、その後、単語の配列を取得するためにObject.keys()を使用し、トップ10を取得するために.slice()を使用することができます。

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(", "));

関連する問題