在javascript数组中查找最高的重复重复项

时间:2017-03-19 04:31:00

标签: javascript arrays

我有一个包含多个名字的数组: [mike,bob,john,john,rick,bob] 有人可以告诉我,找到最重复名称的最有效方法是什么?

5 个答案:

答案 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();

此代码段打印出第一个出现最多次数的字符串。例如,在上面的示例bobjohn中出现了两次。如果您希望打印所有出现最多次数的字符串,您可以迭代计数为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#reduceArray#sortArray#forEach将遍历整个阵列,因此,如果您关注性能(特别是处理大量数据)< / em>,避免这些是最好的做法

&#13;
&#13;
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;
&#13;
&#13;