【问题标题】:how to prevent adding duplicate keys to a javascript array如何防止向 javascript 数组添加重复键
【发布时间】:2012-06-01 05:15:39
【问题描述】:

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

【问题讨论】:

  • 您正在尝试Array 或Object?
  • ES6 现在有 Set native

标签: javascript jquery arrays duplicates key-value


【解决方案1】:

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

var foo = { bar: 0 };

然后使用in 来检查密钥:

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

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

【讨论】:

  • ...假设您的值是字符串或可表示为唯一字符串(包括数字)。
  • @Phrogz 绝对。对 OP 的好建议。
  • 谢谢乔纳森。灯终于点击了我做错了什么。我正要说你的回答也没有帮助,但经过更多的侦探工作,我很高兴地说它工作得很好。并感谢有关对象的提示。我会牢记这一点。
【解决方案2】:
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 的回答中)。

【讨论】:

  • 另外,使用indexOf 的问题在于它本身会产生一个循环......这使得Schlemiel the painter's algorithm 会随着添加到数组中的每个项目而变慢。
【解决方案3】:

在 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}

【讨论】:

【解决方案4】:

如果您已经在使用 spread...

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

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

并希望避免重复...

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

【讨论】:

    【解决方案5】:

    你可以试试这个:

    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

    【讨论】:

      【解决方案6】:

      逻辑错了。考虑一下:

      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)是否存在。现在,价值观是另一回事了...

      快乐编码

      【讨论】:

        【解决方案7】:
        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
        

        【讨论】:

          【解决方案8】:

          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));

          【讨论】:

            猜你喜欢
            • 2020-12-09
            • 2020-12-06
            • 2021-09-23
            • 1970-01-01
            • 1970-01-01
            • 2019-09-25
            • 1970-01-01
            • 1970-01-01
            • 2011-07-12
            相关资源
            最近更新 更多