Есть не менее быстрый вариант с использованием той же идеи что в моем примере, но с использованием новых фишек языка. Стало более читабельно даже.
Есть еще варианты на других библиотеках. Например lodash.
Код:
var array = [];
var limit = 10000;
function getRandom(limit) {
return Math.floor(Math.random() * Math.floor(limit));
}
for(var i=0; i<limit; i++){
array.push(String(getRandom(limit)));
}
var time = new Date().getTime();
array.reduce((agg,col) => {
agg.filter[col] = agg.filter[col]? agg.dup.push(col): 2;
return agg
},
{filter:{},dup:[]})
.dup;
console.log(new Date().getTime() - time); // 2
Код:
var array = [];
var limit = 10000;
function getRandom(limit) {
return Math.floor(Math.random() * Math.floor(limit));
}
for(var i=0; i<limit; i++){
array.push(String(getRandom(limit)));
}
var time = new Date().getTime();
const dup = _(array)
.countBy()
.reduce((acc, val, key) => val > 1 ? acc.concat(key) : acc, [])
.map(_.toNumber)
// console.log(dup);
console.log(new Date().getTime() - time); // 43
Код:
var array = [];
var limit = 10000;
function getRandom(limit) {
return Math.floor(Math.random() * Math.floor(limit));
}
for(var i=0; i<limit; i++){
array.push(String(getRandom(limit)));
}
var time = new Date().getTime();
function getDuplicate(array){
var doubles = {};
array.forEach((v) => doubles[v] = doubles[v] ? doubles[v] + 1 : 1);
doubles = Object.keys(doubles).filter((v) => doubles[v] > 1);
return doubles;
}
getDuplicate(array);
console.log(new Date().getTime() - time); // 2
Код:
var array = [];
var limit = 10000;
function getRandom(limit) {
return Math.floor(Math.random() * Math.floor(limit));
}
for(var i=0; i<limit; i++){
array.push(String(getRandom(limit)));
}
var time = new Date().getTime();
var groupped = _.groupBy(array, function (n) {return n});
var result = _.uniq(_.flatten(_.filter(groupped, function (n) {return n.length > 1})));
console.log(new Date().getTime() - time); // 10
Код:
var array = [];
var limit = 10000;
function getRandom(limit) {
return Math.floor(Math.random() * Math.floor(limit));
}
for(var i=0; i<limit; i++){
array.push(String(getRandom(limit)));
}
var time = new Date().getTime();
_(array).groupBy().pickBy(x => x.length > 1).keys().value()
console.log(new Date().getTime() - time); // 7