39

我想编写一个 javascript 函数来检查数组是否包含重复值。

我已经编写了以下代码,但它给出的答案总是“真实”。

谁能告诉我我错过了什么。

function checkIfArrayIsUnique(myArray) 
    {
        for (var i = 0; i < myArray.length; i++) 
        {
            for (var j = 0; j < myArray.length; j++) 
            {
                if (i != j) 
                {
                    if (myArray[i] == myArray[j]) 
                    {
                        return true; // means there are duplicate values
                    }
                }
            }
        }
        return false; // means there are no duplicate values.
    }
4

17 回答 17

112

一个简单的解决方案,如果你有 ES6,使用Set

function checkIfArrayIsUnique(myArray) {
  return myArray.length === new Set(myArray).size;
}

let uniqueArray = [1, 2, 3, 4, 5];
console.log(`${uniqueArray} is unique : ${checkIfArrayIsUnique(uniqueArray)}`);

let nonUniqueArray = [1, 1, 2, 3, 4, 5];
console.log(`${nonUniqueArray} is unique : ${checkIfArrayIsUnique(nonUniqueArray)}`);

于 2015-12-10T01:13:04.697 回答
23

这应该只适用于一个循环:

function checkIfArrayIsUnique(arr) {
    var map = {}, i, size;

    for (i = 0, size = arr.length; i < size; i++){
        if (map[arr[i]]){
            return false;
        }

        map[arr[i]] = true;
    }

    return true;
}
于 2013-10-29T10:51:45.347 回答
22
let arr = [11,22,11,22];

let hasDuplicate = arr.some((val, i) => arr.indexOf(val) !== i);
// hasDuplicate = true

True -> 数组有重复项

False -> 唯一数组

于 2017-03-15T15:04:29.077 回答
19

您以错误的方式获得了返回值:

  • 只要找到两个相等的值,就可以断定数组不是唯一的并返回false

  • 最后,检查完所有对后,您可以返回true

如果您经常这样做,并且数组很大,您可能需要研究对数组进行排序然后只比较相邻元素的可能性。这将比您当前的方法具有更好的渐近复杂性。

于 2013-10-29T10:49:14.373 回答
7

假设您的目标浏览器不是 IE8,

这也可以:

function checkIfArrayIsUnique(myArray) 
{
    for (var i = 0; i < myArray.length; i++) 
    {
        if (myArray.indexOf(myArray[i]) !== myArray.lastIndexOf(myArray[i])) { 
            return false; 
        } 
    } 
    return true;   // this means not unique
}
于 2013-10-29T10:53:58.847 回答
3

有史以来最好的解决方案。

 Array.prototype.checkIfArrayIsUnique = function() {
    this.sort();    
    for ( var i = 1; i < this.length; i++ ){
        if(this[i-1] == this[i])
            return false;
    }
    return true;
    }
于 2015-01-20T19:05:34.457 回答
2

这是一个 O(n) 的解决方案:

function hasDupes(arr) {
  /* temporary object */
  var uniqOb = {};
  /* create object attribute with name=value in array, this will not keep dupes*/
  for (var i in arr)
    uniqOb[arr[i]] = "";
  /* if object's attributes match array, then no dupes! */
  if (arr.length == Object.keys(uniqOb).length)
    alert('NO dupes');
  else
    alert('HAS dupes');


}
var arr = ["1/1/2016", "1/1/2016", "2/1/2016"];
hasDupes(arr);

https://jsfiddle.net/7kkgy1j3/

于 2016-01-06T20:18:19.007 回答
2

function hasNoDuplicates(arr) { return arr.every(num => arr.indexOf(num) === arr.lastIndexOf(num)); }

hasNoDuplicates接受一个数组,true如果没有重复值则返回。如果有任何重复,该函数返回false.

于 2018-03-02T00:39:28.500 回答
1

迟到的答案,但可能会有所帮助

function areThereDuplicates(args) {

    let count = {};
    for(let i = 0; i < args.length; i++){
         count[args[i]] = 1 + (count[args[i]] || 0);
    }
    let found = Object.keys(count).filter(function(key) {
        return count[key] > 1;
    });
    return found.length ? true : false; 
}

areThereDuplicates([1,2,5]);
于 2019-07-28T13:18:17.463 回答
1

没有for loop,只有using Map()

您也可以返回重复项。

(function(a){
  let map = new Map();

  a.forEach(e => {
    if(map.has(e)) {
      let count = map.get(e);
      console.log(count)
      map.set(e, count + 1);
    } else {
      map.set(e, 1);
    }
  });

  let hasDup = false;
  let dups = [];
  map.forEach((value, key) => {
    if(value > 1) {
      hasDup = true;
      dups.push(key);
    }
  });
   console.log(dups);
   return hasDup;
 })([2,4,6,2,1,4]);
于 2017-08-21T18:10:24.963 回答
1

问题中给出的代码可以更好的写成如下

function checkIfArrayIsUnique(myArray) 
    {
        for (var i = 0; i < myArray.length; i++) 
        {
            for (var j = i+1; j < myArray.length; j++) 
            {                  
                    if (myArray[i] == myArray[j]) 
                    {
                        return true; // means there are duplicate values
                    }

            }
        }
        return false; // means there are no duplicate values.
    }
于 2016-11-07T22:07:05.153 回答
1

写这个来初始化一个长度为 uniqueIndexCount 的新数组。它在这里提出减去不相关的逻辑。

    public Vector3[] StandardizeVertices(Vector3[] dimensions, int standard)
    {
        //determine the number of unique dimension vectors
        int uniqueIndexCount = 0;
        for (int a=0; a < dimensions.Length; ++a)
        {
            int duplicateIndexCount = 0;
            for (int b = a; b < dimensions.Length; ++b)
            {
                if(a!=b && dimensions[a] == dimensions[b])
                {
                    duplicateIndexCount++;
                }
            }
            if (duplicateIndexCount == 0)
            {
                uniqueIndexCount++;
            }
        }
        Debug.Log("uniqueIndexCount: "+uniqueIndexCount);
        return dimensions;
    }
于 2018-02-05T22:56:41.283 回答
0
function checkIfArrayIsUnique(myArray) 
    {
      isUnique=true

        for (var i = 0; i < myArray.length; i++) 
        {
            for (var j = 0; j < myArray.length; j++) 
            {
                if (i != j) 
                {
                    if (myArray[i] == myArray[j]) 
                    {
                        isUnique=false
                    }
                }
            }
        }
        return isUnique;
    }

这假设数组在开始时是唯一的。

如果找到两个相等的值,则更改为 false

于 2013-10-29T10:59:58.893 回答
0

返回数组中的重复项并创建一个没有重复项的新数组:

 var a = ["hello", "hi", "hi", "juice", "juice", "test"];
    var b = ["ding", "dong", "hi", "juice", "juice", "test"];
    var c = a.concat(b);
    var dupClearArr = [];

    function dupArray(arr) {

        for (i = 0; i < arr.length; i++) {
            if (arr.indexOf(arr[i]) != i && arr.indexOf(arr[i]) != -1) {
                console.log('duplicate item ' + arr[i]);
            } else {
                dupClearArr.push(arr[i])
            }

        }
        console.log('actual array \n' + arr + ' \nno duplicate items array \n' + dupClearArr)
    }

    dupArray(c);
于 2017-12-04T07:06:11.867 回答
0

您的代码工作正常,只是需要在两行中进行更改。如果返回 Ture,则表示给定的数组是唯一的,否则不是唯一的。

function checkIfArrayIsUnique(myArray) 
    {
        for (var i = 0; i < myArray.length; i++) 
        {
            for (var j = 0; j < myArray.length; j++) 
            {
                if (i != j) 
                {
                    if (myArray[i] == myArray[j]) 
                    {
                        return false; // means there are duplicate values(change 1)
                    }
                }
            }
        }
        return true; // means there are no duplicate values.(change 2)
    }
于 2021-07-04T14:07:22.640 回答
0

我认为这是简单的方法

$(document).ready(function() {

  var arr = [1,2,3,9,6,5,6];
  
  console.log( "result =>"+ if_duplicate_value (arr));
  
});


function if_duplicate_value (arr){
    
    for(i=0;i<arr.length-1;i++){
        
        for(j=i+1;j<arr.length;j++){
            
            if(arr[i]==arr[j]){
                
                return true;
                
            }
            
        }
        
    }
    
    return false;
    
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

于 2021-03-07T08:16:19.353 回答
0

var c=[2,2,3,3,5,5,4,4,8,8];

for(var i=0; i<b.length; i++){
    for(var j=i+1; j<b.length; j++){
        if(c[i]==c[j]){
            console.log(c[j]);
        }
    }
}

于 2022-03-04T19:21:17.613 回答