2012-10-04 44 views
8

可能重复:
Easiest way to find duplicate values in a JavaScript array如何在Javascript中搜索数组?

我希望找到两个值是否在数组中一样。我写了下面的代码:

function validatePassTimeFields(passtimes) { 
    var success = true; 
    var length = passtimes.length; 
    var hashMap = new Object(); 
    for (var j=0; j<length; j++) { 
     if(hashMap[passtimes[j].value]==1) { 
      success = false; 
      alert("Duplicate Found"); 
      break; 
     } 
     hashMap[passtimes[j].value]=1; 
    } 
    return success; 
} 

我是新来的Javascript,所以我尝试使用HashMap中喜欢找,如果有任何重复。它是在JavaScript中找到重复的最佳方式吗?或者我可以优化它?

+0

你想 “找” 的副本或者 “消灭” 它们? –

+1

看看这些解决方案是否有帮助:http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array – Chase

+0

@JarrodRoberson我只是想找到它们。如果只有其中一个对我来说就够了。 – sheidaei

回答

1

你的功能已经很不错了,除了那它仅适用于使用字符串或数字数组的问题你只需要优化它。关于对象的更多难辨理解方法请参见this answer。我不认为这对你很重要,因为你有明确的限制用例(通过value属性检查身份)。

然而,有些点我会做不同:

  • 不要从整体功能使用success变量,然后从环break,只是return
  • 相反构造的new Object通常快捷对象常量{}用于
  • 代替在hashMap1一个可能使用true设定值;您也可以省略等号运算符==并只检查财产的真实性。我甚至会使用in operator
function validatePassTimeFields(passtimes) { 
    var length = passtimes.length; 
    var hashMap = {}; 
    for (var j=0; j<length; j++) { 
     if (passtimes[j].value in hashMap) { 
      alert("Duplicate Found"); 
      return false; 
     } 
     hashMap[passtimes[j].value] = 1; 
    } 
    return true; 
} 
0

看来你不想找到重复的东西,只是看看有没有?

你很亲密,这是一个工作功能;

var hasDuplicates = function (arr) { 

    var _store = {}; 

    for (var i = 0; i < arr.length; i++) { 

     if (typeof _store["_" + arr[i]] !== "undefined") { 
      return true; 
     } 

     _store["_" + arr[i]] = true; 

    } 

    return false; 

}; 

关联数组中的下划线是存储数值所必需的。 hasDuplicates()函数仅适用于具有toString()方法的对象。

检查重复;

var yourArray = [1, 5, 7, 3, 5, 6]; 

if (hasDuplicates(yourArray)) {... 
+0

伟大的解决方案。清晰而简单。 –

+1

为什么你使用这么多下划线? – Bergi

+0

@Bergi - 我有点“标记”为范围的私有变量。这样就不会将它们与外部范围中的变量混合起来。 –

0

这可能是值得检查下划线的这个功能的实现。如果你只是想消除愚蠢,你可以使用_.uniq(),但如果你只是知道有愚蠢的或纯粹的实施细节感兴趣,你可能会喜欢检查source of this method,这是非常好的记录。

我知道这不是一个直接的代码回答这个问题 - 这里已经有一些了,所以它不会有用的重复。但我认为值得一提的是下划线是一个很好的实用程序库,而源代码是了解更多关于良好编写的JavaScript的好地方。

1

//如果你想使用它其他地方有

function noduplicates(array){ 
    var next, O= {}, 
    L= array.length; 
    while(L){ 
     next= array[--L]; 
     if(O[next]) return false; 
     O[next]= 1; 
    } 
    return true; 
} 


function validatePassTimeFields(passtimes){ 
    if (noduplicates(passtimes)) return true; 

    alert("Duplicate Found"); 
    return false; 
} 
+0

我测试你的代码http://jsfiddle.net/GubnU/,它工作正常。但是,当我在本地运行它时,我必须更改将下一个值分配给以下内容的行:next = array [ - L] .value;任何想法为什么? – sheidaei