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

时间:2012-05-25 15:48:23

标签: javascript jquery arrays duplicates key-value

我发现了很多相关的问题,答案是关于...循环和使用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为什么这么简单如此难以做到。有什么想法使这项工作?

7 个答案:

答案 0 :(得分:37)

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

var foo = { bar: 0 };

然后使用in检查密钥:

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

正如下面的评论中正确指出的那样,当您的密钥是字符串或者可以表示为字符串的项目(例如数字)时,此方法仅适用于

答案 1 :(得分:28)

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的回答中。

答案 2 :(得分:1)

你可以试试这个:

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

Easiest way to find duplicate values in a JavaScript array

答案 3 :(得分:0)

逻辑错误。考虑一下:

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

没有理由循环检查 key (或数组的 indices )是否存在。现在,是一个不同的故事......

快乐编码

答案 4 :(得分:0)

function check (list){
    var foundRepeatingValue = false;
    var newList = [];
    for(i=0;i<list.length;i++){
        var thisValue = list[i];
        if(i>0){
            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

答案 5 :(得分:0)

ES6中使用Sets提供了更好的选择。因此,如果您需要一个不应该添加重复项的数组,则建议使用Sets而不是声明数组。

var array = new Set();
array.add(1);
array.add(2);
array.add(3);

console.log(array);
// Prints: Set(3) {1, 2, 3}

array.add(2); // does not add any new element

console.log(array);
// Still Prints: Set(3) {1, 2, 3}

答案 6 :(得分:0)

如果您已经在使用传播...

let colors = ['red', 'orange', 'yellow'];
let moreColors = ['orange', 'green'];

let mergedColors = [...colors, ...moreColors];

并希望避免重复...

let mergedColors = [...colors, ...moreColors.filter(c => !colors.includes(c)) ];