如何计算单词在数组中重复的次数?

时间:2017-05-10 22:02:08

标签: javascript arrays

我试图从我的数组中删除重复项,并显示特定单词在数组中显示的次数。我已经看到了解决这个问题的方法,但我尝试了我发现的方法,而且他们没有工作。当我输入诸如&#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>

4 个答案:

答案 0 :(得分:0)

以下是使用forArray.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。这是因为当您将thisthis进行比较并发现它们不是同一个词时。然后,您为第二个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'