我有一个包含多个名字的数组:
[mike,bob,john,john,rick,bob]
有人可以告诉我,找到最重复名称的最有效方法是什么?
答案 0 :(得分:0)
使用Array#reduce
方法生成具有计数的对象,稍后使用Object.keys
方法基于计数对属性名称数组(使用Array#sort
方法)进行排序,最后获取第一个元素。
var arr = ['mike', 'bob', 'john', 'john', 'rick', 'bob'];
// generate an object which holds the count
var obj = arr.reduce(function(o, v) {
// define the property if not defined
o[v] = o[v] || 0;
// increment the count
o[v]++;
// return the object reference
return o;
// set initial value as an empty object
}, {});
// sort based on the count, descending order
// and get first
console.log(
Object.keys(obj).sort(function(a, b) {
return obj[b] - obj[a];
})[0]
)
// or using reduce, reduce into a single value
// which holds the highest value
console.log(
Object.keys(obj).reduce(function(a, b) {
return obj[b] > obj[a] ? b : a;
})
)

答案 1 :(得分:0)
查找重复项的标准解决方案(在O(n)时间内)是线性遍历列表并将每个项目添加到集合中。每次执行此操作之前,请检查它是否已在集合中。如果是,您发现了副本。
names = [ 'mike', 'bob', 'john', 'john', 'rick', 'bob'];
seen = new Set();
names.forEach(function(item, index, array) {
if (seen.has(item)) {
console.log(item + " is a duplicate");
} else {
seen.add(item);
}
});
或者,您可以在O(n log(n))时间内进行排序,并在迭代数组时通过排序和检查来保存上面使用的额外空间:
names = [ 'mike', 'bob', 'john', 'john', 'rick', 'bob'];
names.sort().forEach(function(item, index, array) {
if ((index > 0) && (array[index - 1] == item)) {
console.log(item + " is a duplicate");
}
});
答案 2 :(得分:0)
您可以在map
的帮助下找到如下
function findDuplicates() {
var name, names = ['mike', 'bob', 'john', 'john', 'rick', 'bob'];
var map = new Map();
var max = 1;
var maxRecurringString = "";
for(name of names) {
if(map.get(name) === undefined) {
map.set(name, 1);
} else {
var count = map.get(name);
count = count+1;
map.set(name, count);
if(max < count) {
max = count;
maxRecurringString = name;
}
}
}
console.log("Maximum recurring string is ", maxRecurringString, ". Max number of times :" + max);
}
findDuplicates();
此代码段打印出第一个出现最多次数的字符串。例如,在上面的示例bob
和john
中出现了两次。如果您希望打印所有出现最多次数的字符串,您可以迭代计数为max
计数的地图以打印所有字符串。
答案 3 :(得分:0)
function findDup(arr){
var obj={};
for(var i of arr){
if(obj[i]==1){
console.log(i);
}
obj[i]=1;
}
}
findDup([ 'mike', 'bob', 'john', 'john', 'rick', 'bob']);
答案 4 :(得分:0)
如果您正在寻找最有效的方法来讨论性能,那么最好的方法是只在数组上循环一次。
Array#reduce,Array#sort,Array#forEach将遍历整个阵列,因此,如果您关注性能(特别是处理大量数据)< / em>,避免这些是最好的做法
var findHighestRecurring = function(arr) {
arr.sort();
var i = arr.length;
var max = { item:"", count: 0 };
var last = { item:"", count: 0 };
var validate = function() {
if (last.count > max.count) {
max.item = last.item;
max.count = last.count;
}
}
while (i--) {
var curr = arr[i];
if (last.item !== curr) {
validate();
last.item = curr;
last.count = 0;
}
last.count++;
}
validate();
return max;
}
var sample = ["mike","bob","john","bob","john","rick","bob"];
var result = findHighestRecurring(sample);
console.log(result);
&#13;