45

我发现很多相关问题的答案都在谈论 for...in 循环和使用 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为什么这么简单的事情这么难做。有什么想法可以完成这项工作吗?

4

8 回答 8

45

一般来说,这最好用一个对象来完成,因为 JavaScript 并没有真正的关联数组:

var foo = { bar: 0 };

然后用于in检查密钥:

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

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

于 2012-05-25T15:51:45.783 回答
38
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);
});

但是,如果您的所有值都可以简单且唯一地表示为 strings,那么您应该使用 Object 而不是 Array,以潜在地大幅提高速度(如@JonathanSampson 的回答中所述)。

于 2012-05-25T15:52:03.413 回答
22

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

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}
于 2019-03-05T09:36:51.163 回答
2

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

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

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

并希望避免重复...

let mergedColors = [...colors, ...moreColors.filter(c => !colors.includes(c)) ];
于 2021-06-09T21:39:22.603 回答
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);
});

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

于 2017-01-11T12:57:47.237 回答
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

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

快乐编码

于 2012-05-25T15:52:26.593 回答
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
于 2016-01-04T17:11:26.643 回答
-1

let x = "farceus";
let y = "character";

const commonCharacters = function (string1, string2) {
  let duplicateCharacter = "";
  for (let i = 0; i < string1.length; i += 1) {
    if (duplicateCharacter.indexOf(string1[i]) === -1) {
      if (string2.indexOf(string1[i]) !== -1) {
        duplicateCharacter += string1[i];
      }
    }
  }
  return [...duplicateCharacter];
};


console.log(commonCharacters(x, y));

于 2021-11-01T17:18:10.590 回答