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