Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不必两次查看列表就可以找到重复项?_Javascript - Fatal编程技术网

Javascript 不必两次查看列表就可以找到重复项?

Javascript 不必两次查看列表就可以找到重复项?,javascript,Javascript,我需要知道列表中是否存在一个或多个重复项。有没有一种方法可以做到这一点,而无需多次浏览列表 谢谢大家的建议。我最终使用它是因为它是最简单的实现: var names = []; var namesLen = names.length; for (i=0; i<namesLen; i++) { for (x=0; x<namesLen; x++) { if (names[i] === names[x] && (i !== x)) {alert('

我需要知道列表中是否存在一个或多个重复项。有没有一种方法可以做到这一点,而无需多次浏览列表

谢谢大家的建议。我最终使用它是因为它是最简单的实现:

var names = [];
var namesLen = names.length;
for (i=0; i<namesLen; i++) {
    for (x=0; x<namesLen; x++) {
        if (names[i] === names[x] && (i !== x)) {alert('dupe')}
    }
}
var name=[];
var namesLen=names.length;

对于(i=0;i通常的方法是将每个项放入hashmap字典中,您可以检查它是否已插入。如果您的列表是对象,您必须在对象上创建自己的哈希函数,因为您知道是什么使每个项唯一。请查看此问题的答案


通常的方法是将每个项目放入hashmap字典中,您可以检查它是否已插入。如果您的列表是对象列表,您必须在对象上创建自己的哈希函数,因为您知道是什么使每个项目都是唯一的。请查看此问题的答案


如果您的列表只是单词或短语,您可以将它们放入关联数组中

var list=new Array("foo", "bar", "foobar", "foo", "bar");
var newlist= new Array();
for(i in list){
    if(newlist[list[i]])
        newlist[list[i]]++;
    else
        newlist[list[i]]=1;
}
您的最终阵列应如下所示:
“foo”=>2,“bar”=>2,“foobar”=>1

如果您的列表只是单词或短语,您可以将它们放入关联数组中

var list=new Array("foo", "bar", "foobar", "foo", "bar");
var newlist= new Array();
for(i in list){
    if(newlist[list[i]])
        newlist[list[i]]++;
    else
        newlist[list[i]]=1;
}
您的最终阵列应如下所示:
“foo”=>2,“bar”=>2,“foobar”=>1

如果字符串位于数组中(A),则可以使用A.some- 它将返回true,并在找到重复项后立即退出, 或者,如果它已检查了所有项且没有任何重复项,则返回false

has_duplicates= A.some(function(itm){
    return A.indexOf(itm)===A.lastIndexOf(itm);
});

如果字符串位于数组(A)中,则可以使用A.some- 它将返回true,并在找到重复项后立即退出, 或者,如果它已检查了所有项且没有任何重复项,则返回false

has_duplicates= A.some(function(itm){
    return A.indexOf(itm)===A.lastIndexOf(itm);
});

此方法将对象用作查找表,以跟踪找到的dup数量和类型。然后返回一个包含每个dup和dup计数的对象

function findDups(list) {
    var uniques = {}, val;
    var dups = {};
    for (var i = 0, len = list.length; i < len; i++) {
        val = list[i];
        if (val in uniques) {
            uniques[val]++;
            dups[val] = uniques[val];
        } else {
            uniques[val] = 1;
        }
    }
    return(dups);
} 

var data = [1,2,3,4,5,2,3,2,6,8,9,9];
findDups(data);   // returns  {2: 3, 3: 2, 9: 2}

var data2 = [1,2,3,4,5,6,7,8,9];
findDups(data2);  // returns {} 

var data3 = [1,1,1,1,1,2,3,4];
findDups(data3);  // returns {1: 5} 

此方法将对象用作查找表,以跟踪找到的dup数量和类型。然后返回一个包含每个dup和dup计数的对象

function findDups(list) {
    var uniques = {}, val;
    var dups = {};
    for (var i = 0, len = list.length; i < len; i++) {
        val = list[i];
        if (val in uniques) {
            uniques[val]++;
            dups[val] = uniques[val];
        } else {
            uniques[val] = 1;
        }
    }
    return(dups);
} 

var data = [1,2,3,4,5,2,3,2,6,8,9,9];
findDups(data);   // returns  {2: 3, 3: 2, 9: 2}

var data2 = [1,2,3,4,5,6,7,8,9];
findDups(data2);  // returns {} 

var data3 = [1,1,1,1,1,2,3,4];
findDups(data3);  // returns {1: 5} 

什么?字符串、整数等的列表……下划线的uniq方法可能会引起您的兴趣。@JaredPar在本例中是字符串。听起来像是一个面试问题。这是最低效的方法。可能最简单,但您要查看列表n^2次。添加几百个项目,它会阻塞。至少如果您要这样低效的话请删除被复制的项目,这样就不会在同一个项目上有多个警报,并使x=i+1开始第二个循环,这样就不会每次通过时都比较相同的项目。这将使您更接近n*log(n)仍然不好,但不是。一个什么的列表?字符串、整数等…下划线的uniq方法可能会引起您的兴趣。@JaredPar在本例中是字符串。听起来像是一个面试问题。这是最低效的方法。可能最简单,但您正在浏览列表n^2次。添加几百个项目,它将阻塞。至少如果您要这样做的话为了降低效率,请删除被复制的项目,这样您就不会在同一个项目上有多个警报,并使x=i+1开始第二个循环,这样您就不会每次通过都比较相同的项目。这将使您更接近n*log(n)仍然很糟糕,但不是那样。不,不,不。不要用for-in循环迭代数组!今天学到了一些新东西!不,不,不。不要用for-in循环迭代数组!今天学到了一些新东西!我打赌这有二次时间复杂度。我打赌这有二次时间复杂度。使用ES6结构更新答案,如
Set
Map
。这还允许
findDups()
用于任何类型的数组元素,包括对象(不仅仅是具有唯一自动字符串转换的对象)。使用ES6结构更新了答案,如
Set
Map
。这还允许
findDups()
用于任何类型的数组元素,包括对象(不仅仅是具有唯一自动字符串转换的内容)。