我想编写一个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.
}
答案 0 :(得分:58)
An easy solution, if you've got ES6, uses Set:
function checkIfArrayIsUnique(myArray) {
return myArray.length === new Set(myArray).size;
}
答案 1 :(得分:17)
这应该只适用于一个循环:
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;
}
答案 2 :(得分:16)
你得到的返回值是错误的:
只要找到两个相等的值,就可以得出结论:该数组不唯一且返回false
。
最后,在您检查了所有配对后,您可以返回true
。
如果你这么做,并且数组很大,你可能想要研究对数组进行排序然后只比较相邻元素的可能性。这将比您当前的方法具有更好的渐近复杂度。
答案 3 :(得分:5)
有史以来最好的解决方案。
Array.prototype.checkIfArrayIsUnique = function() {
this.sort();
for ( var i = 1; i < this.length; i++ ){
if(this[i-1] == this[i])
return false;
}
return true;
}
答案 4 :(得分:3)
假设您的目标浏览器不是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
}
答案 5 :(得分:3)
let a = [11,22,11,22];
let hasDup = a.some((val,i)=>{
return a.indexOf(val)!=i
})
// hasDup = true
真 - &gt;数组有重复
错误 - &gt; uniqe数组
答案 6 :(得分:2)
function hasNoDuplicates(arr) {
return arr.every(num => arr.indexOf(num) === arr.lastIndexOf(num));
}
hasNoDuplicates
接受一个数组,如果没有重复值,则返回true
。如果有任何重复,则函数返回false
。
答案 7 :(得分:1)
这是一个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);
答案 8 :(得分: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]);
答案 9 :(得分: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;
}
答案 10 :(得分: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
答案 11 :(得分:0)
问题中给出的代码可以更好地编写如下
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.
}
答案 12 :(得分: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);
答案 13 :(得分:0)
最新答案,但可能会有帮助
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]);
答案 14 :(得分: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>
答案 15 :(得分: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)
}