2017-05-10 27 views
0

我正在创建一个字符串的单词列表。然后我把这个字符串分成单个单词,收集每个单词重复多少次并显示它。一切都有那里完美的作品。但是,结果显示的单词和计数没有特定的顺序。我会首先以最高的数字显示它们。我生成了以下代码:当数字是每个条目的第一部分时,如何在Javascript中对数组进行数字排序?

<!DOCTYPE html> 
<html> 
<body> 

<p>Click the button to display the array values after the split.</p> 

<button onclick="analyze()">Analyze</button> 

<p id="displayText"></p> 

<script> 
function analyze() { 
    var str = "This this is is is is is is is is is is is is is is is just just a test test test"; 
    var res = str.split(" "); 
    document.getElementById("displayText").innerHTML = res; 
    document.getElementById("displayText").innerHTML += "<br/><br/>The amount of words is: " + res.length + "<br/><br/><br/>"; 

    document.getElementById("displayText").innerHTML += "The list of words:<br/><br/>"; 

    var words = []; 

    var wordsWithCount = []; 

    for (i = 0; i < res.length; i++) { 
     words.push(res[i]); 
     document.getElementById("displayText").innerHTML += words[i] + "<br/><br/>"; 
    } 

    var current = null; 
    var cnt = 0; 
    for (var i = 0; i < words.length; i++) { 
     if (words[i] != current) { 
      if (cnt > 0) { 
       document.getElementById("displayText").innerHTML += "<br/><br/>" + cnt + " - " + current + "<br/>"; 
       wordsWithCount.push(cnt + " - " + current); 
      } 
      current = words[i]; 
      cnt = 1; 
     } else { 
      cnt++; 
     } 
    } 

    if (cnt > 0) { 
     document.getElementById("displayText").innerHTML += "<br/><br/>" + cnt + " - " + current + "<br/>"; 
     wordsWithCount.push(cnt + " - " + current); 
    } 

    wordsWithCount.sort(); 

    document.getElementById("displayText").innerHTML += "<br/><br/><br/><br/><br/>The list of SORTED words:<br/><br/>"; 

    for (i = 0; i < wordsWithCount.length; i++) { 
     document.getElementById("displayText").innerHTML += wordsWithCount[i] + "<br/><br/>"; 
    } 
} 
</script> 

</body> 
</html> 

这是输出的最后一位。正如你所看到的,它正在排序,但只有第一位。因此,15之前显示2.任何想法?

的已排序的单字的列表:

1 - 这

1 - 一个

1 - 这

15 - 是

2 - 只是

3 - 测试

我很可能需要在某些时候将它分成两个数组,因为我希望用户能够复制和粘贴所有的单词,而不需要数字。但是,我认为这将是最后一步,因为如果我将每个单词的频率分解为它自己的数字数组,并将这些单词保留在它们自己的数组中,那么sort函数将对一个数组进行排序,而另一个数组数组不会遵循。

+2

'parseInt函数()'不关心是否有非数字文本* *后一个数字,字符串的开始。 – Pointy

+0

@Pointy,你能否为我澄清一下你的答案?你是说我可以在我的代码中使用'parseInt()'来让它做我想要的吗?你能提供一个我如何使用它的例子吗? – Ryan

+0

https://stackoverflow.com/questions/15478954/sort-array-elements-string-with-numbers-natural-sort – Bergi

回答

1

使用Intl.Collator。就像这样:

var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'}); 
var test = ['1 - this', '3 - this', '14 - this']; 
test.sort(collator.compare); 

输出["1 - this", "3 - this", "14 - this"]

var collator = new Intl.Collator(undefined, {numeric: true, sensitivity: 'base'}); 
 
    var test = ['1 - this', '3 - this', '14 - this']; 
 
    console.log(test.sort(collator.compare));

0

你可以只添加自定义比较函数传递到您的通话wordsWithCount.sort()。在这里,我宣布了一个名为compareWordCount的函数,并使用了建议方法@Pointy;使用parseInt忽略所有附加到数组值的非整数部分。看看这方面的工作片段:

<!DOCTYPE html> 
 
<html> 
 
<body> 
 

 
<p>Click the button to display the array values after the split.</p> 
 

 
<button onclick="analyze()">Analyze</button> 
 

 
<p id="displayText"></p> 
 

 
<script> 
 
function compareWordCount(a,b) { 
 
    if (parseInt(a) < parseInt(b)) 
 
    return -1; 
 
    return 1; 
 
} 
 

 
function analyze() { 
 
    var str = "This this is is is is is is is is is is is is is is is just just a test test test"; 
 
    var res = str.split(" "); 
 
    document.getElementById("displayText").innerHTML = res; 
 
    document.getElementById("displayText").innerHTML += "<br/><br/>The amount of words is: " + res.length + "<br/><br/><br/>"; 
 

 
    document.getElementById("displayText").innerHTML += "The list of words:<br/><br/>"; 
 

 
    var words = []; 
 

 
    var wordsWithCount = []; 
 

 
    for (i = 0; i < res.length; i++) { 
 
     words.push(res[i]); 
 
     document.getElementById("displayText").innerHTML += words[i] + "<br/><br/>"; 
 
    } 
 

 
    var current = null; 
 
    var cnt = 0; 
 
    for (var i = 0; i < words.length; i++) { 
 
     if (words[i] != current) { 
 
      if (cnt > 0) { 
 
       document.getElementById("displayText").innerHTML += "<br/><br/>" + cnt + " - " + current + "<br/>"; 
 
       wordsWithCount.push(cnt + " - " + current); 
 
      } 
 
      current = words[i]; 
 
      cnt = 1; 
 
     } else { 
 
      cnt++; 
 
     } 
 
    } 
 

 
    if (cnt > 0) { 
 
     document.getElementById("displayText").innerHTML += "<br/><br/>" + cnt + " - " + current + "<br/>"; 
 
     wordsWithCount.push(cnt + " - " + current); 
 
    } 
 

 
    wordsWithCount.sort(compareWordCount); 
 

 
    document.getElementById("displayText").innerHTML += "<br/><br/><br/><br/><br/>The list of SORTED words:<br/><br/>"; 
 

 
    for (i = 0; i < wordsWithCount.length; i++) { 
 
     document.getElementById("displayText").innerHTML += wordsWithCount[i] + "<br/><br/>"; 
 
    } 
 
} 
 
</script> 
 

 
</body> 
 
</html>

+0

您的比较器功能在两个数字相同的情况下不正确。在这种情况下,该函数应该返回'0'而不是'1',并且是肯定的。 – Pointy

相关问题