我需要知道列表中是否存在一个或多个重复项。有没有办法在不经过列表的情况下多次执行此操作?
谢谢大家的建议。我最终使用它,因为它是最简单的实现:
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')}
}
}
答案 0 :(得分:3)
通常这样做的方法是将每个项目放在一个hashmap字典中,然后检查它是否已经插入。如果您的列表是对象,则必须在对象上创建自己的哈希函数,因为您知道每个对象的唯一性。看看这个问题的答案。
答案 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