2

可能重复:
数组值计数 javascript

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

数组看起来像这样

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

因此我想做这样的事情

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

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

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

4

7 回答 7

3

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

// 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
于 2013-01-09T03:55:18.840 回答
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原型中:

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;
}
于 2013-01-09T03:55:05.827 回答
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']

于 2013-01-09T03:58:46.150 回答
0

我看到了这篇关于它的帖子,也许它可以帮助:

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

于 2013-01-09T03:56:25.687 回答
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>
于 2013-01-09T03:57:50.347 回答
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)');
}
于 2013-01-09T04:12:02.307 回答
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 属性时要记住的事情。

于 2013-01-09T04:26:59.383 回答