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

时间:2013-01-09 03:46:50

标签: javascript

  

可能重复:
  Array value count javascript

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

数组看起来像这样

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

因此我想做这样的事情

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

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

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

7 个答案:

答案 0 :(得分:3)

您可以使用具有Array值的键的对象,并执行类似这样的操作

// 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的修改版本会更高效一点,我会称之为{{ 1}}

getCount2

答案 1 :(得分:1)

尝试此功能:

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.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;
}

答案 2 :(得分:1)

如何使用命名属性构建对象?

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}

然后你可以迭代,然后在需要时对它们进行排序。

最后要计算,你可以使用摘要['aa']

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

<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>

答案 5 :(得分:0)

希望这能解决您的问题

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)');
}

答案 6 :(得分:0)

此功能可以完成您所需的一切。

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;
}

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

这意味着在对象分配期间,键将标准化为字符串,并且不能依赖于唯一性。也就是说,此功能无法识别3'3'的重复项之间的差异。举个例子,如果我要表演:

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

代替t使用的密钥最终会t.toString(),从而导致{'[object Object]': 1}可能令人惊讶的对象。使用Javascript属性时要记住一些事项。