我试图从我的数组中删除重复项,并显示特定单词在数组中显示的次数。我已经看到了解决这个问题的方法,但我尝试了我发现的方法,而且他们没有工作。当我输入诸如&#34之类的文本时,这是一个测试测试,"它将返回最终排序列表:
1 - 是
1 - a
2 - 这个
2 - 测试
虽然我最终会颠倒数组的顺序,所以最高的数字是列表中的第一个,这个结果是完美的!但是,如果我将文本稍微更改一下,就像"这是一个测试测试,"订单完全没有了,如下所示:
1 - 这个
1 - 是
1 - a
1 - 这个
2 - 测试
如您所见,'测试'显示2x,这很棒,但是这个'在列表中显示两次只有一个数字' 1'。 仅编译连续的重复项。我该如何防止这种情况?
这是我的代码:
<!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 is a test test this";
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)
以下是使用for
和Array.prototype.forEach()
的可能解决方案:
var str = "One Two Three One One Three Two One Two Three",
arr = str.split(' '),
res = {},
nb = 0;
for (var i = 0; i < arr.length; i++) {
nb = 0;
arr.forEach(function (item) {
if (item === arr[i]) {
nb++;
}
});
if (!res[arr[i]]) {
res[arr[i]] = nb;
}
}
console.log(res);
答案 1 :(得分:0)
尝试使用对象存储每个单词的计数:
var str = "this is a test test this";
var words = str.split(" ");
var wordsWithCount = {};
for (var i = 0; i < words.length; i++) {
var word = words[i];
if (word in wordsWithCount) {
wordsWithCount[word]++;
} else {
wordsWithCount[word] = 1;
}
}
console.log("WORD COUNTS");
for (word in wordsWithCount) {
console.log(word + " - " + wordsWithCount[word]);
}
var sortable = [];
for (var word in wordsWithCount) {
sortable.push([word, wordsWithCount[word]]);
}
sortable.sort(function(a, b) {
return b[1] - a[1];
});
console.log("SORTED WORD COUNTS");
for (var i = 0; i < sortable.length; i++) {
var word = sortable[i][0];
console.log(word + " - " + wordsWithCount[word]);
}
答案 2 :(得分:0)
我确实认为GSerg是正确的,但是为了帮助您理解代码中发生的事情的逻辑,这里是您的代码实际在做的事情,用文字:
首先,您正在使用字符串Regulation
并将其拆分为数组:this is a test test this
在循环的每次迭代中,您将当前单词与前一单词进行比较。如果当前单词与前一个单词相同,则增加计数器。如果当前单词不与前一个单词相同,则您将前一个单词添加到words = [this,is,a,test,test,this]
数组的 end 。
这一直顺利,直到你到达阵列中的第二个wordsWithCount
。这是因为当您将this
与this
进行比较并发现它们不是同一个词时。然后,您为第二个test
启动一个全新的计数器。使用此新计数器,您还可以添加this
数组的 end ,而不是添加到wordsWithCount
的现有计数器。
为了防止这种情况,您可以使用键值结构而不是普通数组:
this
这会给你这个结构:
for (var i = 0; i < words.length; i++) {
if(wordsWithCount[words[i]] == undefined) {
wordsWithCount[words[i]] = 1;
} else {
wordsWithCount[words[i]]++;
}
}
您也可以遍历结构以创建您提到的格式化列表:
wordsWithCount: {
'this': 2,
'is': 1,
'a': 1,
'test': 2
}
答案 3 :(得分:0)
这是一个忽略大小写和标点符号的解决方案。
SELECT COUNT(u.id)
FROM dbemUser u JOIN
dbemEvent e
ON u.Event = e.Id
WHERE e.EventName = 'Home'