Javascript 查找并显示重复的值

Javascript 查找并显示重复的值,javascript,duplicate-detection,Javascript,Duplicate Detection,你知道怎么做吗 var MyArr = [0,1,2,3,"something",44,661,3,1,"something"] var Results = [1,3,"something"] 我只想在数组中找到重复的值。使用for循环: var Results = []; MyArr.forEach(function(el, idx){ //check if value is duplicated var duplicated = MyArr.indexOf(el, idx

你知道怎么做吗

var MyArr = [0,1,2,3,"something",44,661,3,1,"something"]
var Results = [1,3,"something"]
我只想在数组中找到重复的值。

使用for循环:

var Results = [];
MyArr.forEach(function(el, idx){
    //check if value is duplicated
    var duplicated = MyArr.indexOf(el, idx + 1) > 0;
    if(duplicated && Results.indexOf(el) < 0) {
        //duplicated and not in array
        Results.push(el);
    }
});
var结果=[];
MyArr.forEach(函数(el,idx){
//检查值是否重复
重复var=MyArr.indexOf(el,idx+1)>0;
if(重复的和结果索引(el)<0){
//重复且不在数组中
结果:推挤(el);
}
});
使用for循环:

var Results = [];
MyArr.forEach(function(el, idx){
    //check if value is duplicated
    var duplicated = MyArr.indexOf(el, idx + 1) > 0;
    if(duplicated && Results.indexOf(el) < 0) {
        //duplicated and not in array
        Results.push(el);
    }
});
var结果=[];
MyArr.forEach(函数(el,idx){
//检查值是否重复
重复var=MyArr.indexOf(el,idx+1)>0;
if(重复的和结果索引(el)<0){
//重复且不在数组中
结果:推挤(el);
}
});

您可以将每个值存储在一个新数组中,在向该数组添加新项之前,请检查它是否已经存在,并返回结果。使用Array.forEach()的示例:

var myArr=[1,2,3,2];
var结果=[];
myArr.forEach(功能(项目){
if(结果索引(项目)<0){
结果:推送(项目);
}
});
如果只需要重复的值,可以使用非常类似的方法并使用Array.filter


注意:注意Array.indexOf()在IE8上不起作用,例如,您可以使用方法

将每个值存储在一个新数组中,在向这样的数组添加新项之前,检查它是否已经存在,并返回结果。使用Array.forEach()的示例:

var myArr=[1,2,3,2];
var结果=[];
myArr.forEach(功能(项目){
if(结果索引(项目)<0){
结果:推送(项目);
}
});
如果只需要重复的值,可以使用非常类似的方法并使用Array.filter

注意:注意Array.indexOf()在IE8上不起作用,例如,您可以使用带有O(n)时间和O(n)空间的方法解决方案。例如:

Results = duplicates(MyArr); 
使用地图数据结构。仅当MyArr中有字符串或数字时有效

function duplicates(input) {

    var results = [],
        _map = {};

    for (var i in input) {

        if (typeof _map[input[i]] == "undefined") {

            _map[input[i]] = 1;
        } 
        else {

            _map[input[i]]++;
        }
    }

    for (var argument in _map) {

        if (_map[argument] > 1) {

            results.push(argument);
        }
    }

    return results;
}
PS:因为_map[input[i]]需要O(1)个时间,因为它是一个哈希表,但indexOf()需要O(n)个时间。 PS2:另一个常数较低的溶液:

function duplicates(input) {

    var results = [],
        _map = {};
        WAS = 1,
        SKIP = -1;

    for (var i in input) {

        if (typeof _map[input[i]] == "undefined") {

            _map[input[i]] = WAS;
        } 
        else if (_map[input[i]] == WAS) {

            _map[input[i]] = SKIP;
            results.push(input[i]);
        } 
    }

    return results;
}
具有O(n)时间和O(n)空间的解。例如:

Results = duplicates(MyArr); 
使用地图数据结构。仅当MyArr中有字符串或数字时有效

function duplicates(input) {

    var results = [],
        _map = {};

    for (var i in input) {

        if (typeof _map[input[i]] == "undefined") {

            _map[input[i]] = 1;
        } 
        else {

            _map[input[i]]++;
        }
    }

    for (var argument in _map) {

        if (_map[argument] > 1) {

            results.push(argument);
        }
    }

    return results;
}
PS:因为_map[input[i]]需要O(1)个时间,因为它是一个哈希表,但indexOf()需要O(n)个时间。 PS2:另一个常数较低的溶液:

function duplicates(input) {

    var results = [],
        _map = {};
        WAS = 1,
        SKIP = -1;

    for (var i in input) {

        if (typeof _map[input[i]] == "undefined") {

            _map[input[i]] = WAS;
        } 
        else if (_map[input[i]] == WAS) {

            _map[input[i]] = SKIP;
            results.push(input[i]);
        } 
    }

    return results;
}

可以通过使用属性为集合元素且值为出现次数的对象来模拟计数集合。因此,您可以将数组转换为计数集,并读取计数为两个或更多的元素。(仅当MyArr的元素是字符串或数字时,此选项才有效。)

所以试试这个:

var counts = {} ;
MyArr.forEach(function(el){
    counts[el] = counts[el]==undefined ? 1 : counts[el]+1 ;
});
var Results = Object.keys(counts).filter(function(el){
    return counts[el] > 1 ;
}) ;

可以通过使用属性为集合元素且值为出现次数的对象来模拟计数集合。因此,您可以将数组转换为计数集,并读取计数为两个或更多的元素。(仅当MyArr的元素是字符串或数字时,此选项才有效。)

所以试试这个:

var counts = {} ;
MyArr.forEach(function(el){
    counts[el] = counts[el]==undefined ? 1 : counts[el]+1 ;
});
var Results = Object.keys(counts).filter(function(el){
    return counts[el] > 1 ;
}) ;

没问题^ ^很乐意帮助@Maniootek这不是一个O(n^2)解决方案吗?很明显,这是一个O(n^2)解决方案。没问题^ ^很乐意帮助@Maniootek这不是一个O(n^2)解决方案吗?很明显,这是一个O(n^2)解决方案。这将获得所有值(包括不重复的值)。为什么要添加jQuery?“这将获得所有值(包括不重复的值)”呃。。。?好的,您的版本快了一点,因为您无论如何都会指示索引。这将获得所有值(包括不重复的值)。为什么要添加jQuery?“这将获得所有值(包括不重复的值)”呃。。。?好吧,你的版本快了一点,因为你指明了索引。@Daniel,从技术上讲,这重复了另一个问题,但该问题有一个有缺陷的可接受答案(不能正确处理三重答案),并且有几个答案错误地解释了该问题(并提供了确定唯一性的算法)。@Daniel,从技术上讲,这重复了另一个问题,但该问题有一个有缺陷的可接受答案(不能正确处理三重答案),并且有几个答案错误地解释了该问题(并提供了确定唯一性的算法)。