计算一个数组中有多少字符串在同一数组中重复

Count how many strings in an array have duplicates in the same array

本文关键字:数组 字符串 多少 一个 计算      更新时间:2023-09-26

可能重复:
数组值计数javascript

我有一个数组,它包含几个重复项,我试图实现的是计算每个唯一字符串在这个数组中有多少重复项。

阵列看起来像这个

array = ['aa','bb','cc','aa','ss','aa','bb'];

因此,我想做一些类似的事情

if (xWordOccurrences >= 5) {
    // do something
}

但我不确定该如何编码。我在想,用每个唯一的字符串创建一个对象,然后在原始数组中循环,将每个字符串与它的对象匹配,并将其数字递增1,然后在对象上循环,看看哪些单词重复最多。。。

但这似乎是一种过于复杂的方法。

您可以使用一个具有数组值键的对象,并执行类似的操作

// count everything
function getCounts(arr) {
    var i = arr.length, // var to loop over
        obj = {}; // obj to store results
    while (i) obj[arr[--i]] = (obj[arr[i]] || 0) + 1; // count occurrences
    return obj;
}
// get specific from everything
function getCount(word, arr) {
    return getCounts(arr)[word] || 0;
}
getCount('aa', ['aa','bb','cc','aa','ss','aa','bb']);
// 3

如果你只想得到一个,那么使用getCounts的修改版本会更有效率,它看起来类似于getCount,我称之为getCount2

function getCount2(word, arr) {
    var i = arr.length, // var to loop over
        j = 0; // number of hits
    while (i) if (arr[--i] === word) ++j; // count occurance
    return j;
}
getCount2('aa', ['aa','bb','cc','aa','ss','aa','bb']);
// 3

试试这个函数:

var countOccurrences = function(arr,value){
    var len = arr.length;
    var occur = 0;
    for(var i=0;i<len;i++){
        if(arr[i]===value){
            occur++;
        }
    }
    return occur;
}
var count = countOccurrences(['aaa','bbb','ccc','bbb','ddd'],'bbb');    //2

如果您愿意,还可以将此功能添加到Array原型中:

Array.prototype.countOccurrences = function(value){
    var len = this.length;
    var occur = 0;
    for(var i=0;i<len;i++){
        if(this[i]===value){
            occur++;
        }
    }
    return occur;
}

构建一个具有命名属性的对象怎么样?

var array = ['aa','bb','cc','aa','ss','aa','bb'];
var summary = {};
var item = '';
for ( i in array){
    item = array[i];
    if(summary[item]){
        summary[item] += 1;
    }
    else{
        summary[item] = 1;
    }
}
console.log( summary );

摘要将包含这样的

{aa: 3, bb: 2, cc: 1, ss: 1}

然后可以对其进行迭代,然后根据需要对其进行排序。

最后,您可以使用summary[aa']

<script type="text/javascript">
    var array = ['aa','bb','cc','aa','ss','aa','bb'];
    var myMap = {};
    for(i = 0; i < array.length; i++) {
        var count = myMap[array[i]];
        if(count != null) {
            count++;
        } else {
            count = 1;
        }
        myMap[array[i]] = count;
    }
    // at this point in the script, the map now contains each unique array item and a count of its entries
</script>

希望这能解决的问题

var array = ['aa','bb','cc','aa','ss','aa','bb'];
var dups = {};
for (var i = 0, l = array.length; i < l; i++ ) {
  dups[array[i]] = []; 
}
for (str in dups) {
  for (var i = 0, l = array.length; i < l; i++ ) {
    if (str === array[i]) {
      dups[str].push(str); 
    }
  }
}
for (str in dups) {
  console.log(str + ' has ' + (dups[str].length - 1) + ' duplicate(s)');
}

这个函数可以完成您需要的一切。

function countDupStr(arr, specifier) {
    var count = {}, total = 0;
    arr.forEach(function (v) {
        count[v] = (count[v] || 0) + 1;
    });
    if(typeof specifier !== 'undefined') {
        return count[specifier] - 1;
    }
    Object.keys(count).forEach(function (k) {
        total += count[k] - 1;
    });
    return total;
}

数组中的每个值都会分配给count对象并递增。无论是否传递了说明符,函数都将返回该特定字符串的重复项或重复项总数。请注意,这种特殊的技术只适用于数组中的字符串强制值,因为Javascript只能按字符串对对象进行索引。

这意味着,在对象分配过程中,键将规范化为字符串,并且不能依赖于唯一性。也就是说,该函数将无法辨别3'3'的重复之间的差异。举个例子,如果我要执行:

var o = {}, t = {};
o[t] = 1;
console.log(o);

代替t使用的密钥最终将是t.toString(),从而产生了{'[object Object]': 1}这个可能令人惊讶的对象。只是在使用Javascript属性时需要记住的一点。

我看到了这篇关于它的帖子,也许它会有所帮助:

http://ryanbosinger.com/blog/2011/javascript-count-duplicates-in-an-array/