查找重复项而不通过列表两次?

时间:2011-10-28 22:39:28

标签: 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('dupe')}
    }
}

4 个答案:

答案 0 :(得分:3)

通常这样做的方法是将每个项目放在一个hashmap字典中,然后检查它是否已经插入。如果您的列表是对象,则必须在对象上创建自己的哈希函数,因为您知道每个对象的唯一性。看看这个问题的答案。

JavaScript Hashmap Equivalent

答案 1 :(得分:3)

此方法使用对象作为查找表来跟踪找到的副本数量和数量。然后它返回一个带有每个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} 

由于我们现在提供了内置Map对象的ES6,因此这是使用findDups()对象的Map版本:

function findDups(list) {
    const uniques = new Set();     // set of items found
    const dups = new Map();        // count of items that have dups
    for (let val of list) {
        if (uniques.has(val)) {
            let cnt = dups.get(val) || 1;
            dups.set(val, ++cnt);
        } else {
            uniques.add(val);
        }
    }
    return dups;
} 

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

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

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

// display resulting Map object (only used for debugging display in snippet)
function log(map) {
    let output = [];
    for (let [key, value] of map) {
        output.push(key + " => " + value);
    }
    let div = document.createElement("div");
    div.innerHTML = "{" + output.join(", ") + "}";
    document.body.appendChild(div);
}

答案 2 :(得分:2)

如果您的字符串在数组(A)中,您可以使用A.some- 一旦找到重复,它将返回true并退出, 如果它没有任何重复,则返回false。

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

答案 3 :(得分:0)

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

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