如何防止向javascript数组添加重复键

我找到了很多相关的问题,答案是关于…循环和使用hasOwnProperty,但我没有做任何正常的工作。 我想要做的就是检查数组中是否存在密钥,如果没有,则添加它。

我从一个空数组开始然后添加键,因为页面是用jQuery擦除的。

最初,我希望像下面那样简单的东西可以工作:(使用通用名称)

if (!array[key]) array[key] = value; 

不行。 跟进:

 for (var in array) { if (!array.hasOwnProperty(var)) array[key] = value; } 

还尝试过:

 if (array.hasOwnProperty(key) == false) array[key] = value; 

这些都没有奏效。 要么没有任何东西被推送到数组,要么我尝试的只不过是简单地声明array[key] = value为什么这么简单如此难以做到。 任何使这项工作的想法?

一般来说,使用对象可以更好地完成,因为JavaScript实际上没有关联数组:

 var foo = { bar: 0 }; 

然后使用in来检查密钥:

 if ( !( 'bar' in foo ) ) { foo['bar'] = 42; } 

正如下面的评论中正确指出的那样, 只有当您的键是字符串或可以表示为字符串的项(例如数字)时,此方法才有用。

 var a = [1,2,3], b = [4,1,5,2]; b.forEach(function(value){ if (a.indexOf(value)==-1) a.push(value); }); console.log(a); // [1, 2, 3, 4, 5] 

有关更多详细信息,请阅读Array.indexOf

如果你想依赖jQuery,而是使用jQuery.inArray

 $.each(b,function(value){ if ($.inArray(value,a)==-1) a.push(value); }); 

但是,如果所有值都简单且唯一地表示为字符串 ,则应使用Object而不是Array,以提高速度(如@JonathanSampson的答案中所述)。

你可以试试这个:

 var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"]; var uniqueNames = []; $.each(names, function(i, el){ if($.inArray(el, uniqueNames) === -1) uniqueNames.push(el); }); 

在JavaScript数组中查找重复值的最简单方法

逻辑错了。 考虑一下:

 x = ["a","b","c"] x[0] // "a" x["0"] // "a" 0 in x // true "0" in x // true x.hasOwnProperty(0) // true x.hasOwnProperty("0") // true 

没有理由循环检查密钥 (或数组的索引 )是否存在。 现在, 价值观是另一回事……

快乐的编码

 function check (list){ var foundRepeatingValue = false; var newList = []; for(i=0;i0){ if(newList.indexOf(thisValue)>-1){ foundRepeatingValue = true; console.log("getting repeated"); return true; } } newList.push(thisValue); } return false; } 

 var list1 = ["dse","dfg","dse"]; check(list1); 

输出:

 getting repeated true