8

可能重复:
在 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 中查找重复项的最佳方法吗?或者我可以优化它?

4

4 回答 4

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;
}
于 2012-10-04T17:58:46.163 回答
1

您的函数已经非常好,除了它仅适用于带有字符串或数字的数组的问题。对于关心对象的更困难的方法,请参见此答案。我认为这对您来说并不重要,因为您有一个明确且受限制的用例(通过value属性检查身份)。

但是,我会做一些不同的事情:

  • 不要使用success变量和break来自循环,而只return使用整个函数。
  • 通常使用new Object快捷方式对象文字而不是构造函数{}
  • hashMap而不是在to中设置值1可能会使用true; 你也可以省略相等运算符==,只检查属性的真实性。我什至会使用inoperator
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;
}
于 2012-10-04T18:43:51.653 回答
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)) {...
于 2012-10-04T17:34:34.210 回答
0

可能值得检查下划线对此功能的实现。如果您只是想消除欺骗,您可以使用_.uniq(),但如果您对知道存在欺骗或纯粹的实现细节更感兴趣,您可能会喜欢查看此方法的来源,即很好地记录在案。

我知道这不是问题的直接代码答案 - 这里已经有一些,所以重复没有用。但我认为值得一提的是,underscore 是一个很棒的实用程序库,并且源代码是了解更多关于编写良好的 javascript 的好地方。

于 2012-10-04T17:40:23.787 回答