我有一个包含多个重复项的数组,我想要实现的是计算每个唯一字符串在这个数组中有多少重复。
数组看起来像这样
array = ['aa','bb','cc','aa','ss','aa','bb'];
因此我想做这样的事情
if (xWordOccurrences >= 5) {
// do something
}
但我不确定如何编码。 我在想,用每个唯一的字符串创建一个对象,然后循环遍历原始数组,将每个字符串与它的对象匹配,并将其数字增加1,然后遍历该对象以查看哪些单词具有最多重复...
但这似乎是一种过于复杂的方式。
答案 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属性时要记住一些事项。