如何在Javascript中搜索数组?

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中查找重复项的最佳方法吗?还是有其他优化方法?


1
看看这些解决方案是否有帮助:https://dev59.com/eXRA5IYBdhLWcg3wvgsb - Chase
4
这对于刚接触 JavaScript 的人来说是一个出乎意料的好函数。+1 - NullUserException
1
@NullUserException 謝謝,你說它不太work是什麼意思?你是指我寫的代碼嗎?我測試過它是可以工作的。 - sheidaei
2
你的代码应该没问题,但是这个问题可能更适合在 http://codereview.stackexchange.com 上提问。 - I Hate Lazy
2
@sheidaei:你的函数认为如果它们转换为相同的字符串,则值相等(重复)(即,它适用于字符串数组,但不适用于对象数组等)。 - Bergi
显示剩余14条评论
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;
}

我正在测试你的代码http://jsfiddle.net/GubnU/,它运行良好。但是,当我在本地运行它时,我必须更改分配下一个值的那一行代码如下:next= array[--L].value; 有什么想法吗? - sheidaei

1

你的函数已经很好了,除了它只适用于包含字符串或数字的数组的问题。如果要更难处理对象,请参见this answer。我认为这对你并不重要,因为你有一个明确且受限制的用例(通过value属性检查身份)。

然而,我会做一些不同的事情:

  • 不要使用success变量和从循环中break,而是从整个函数中return
  • 通常使用快捷对象字面量{}代替构造函数new Object
  • hashMap中的值设置为true而不是1;您还可以省略等号运算符==,只需检查属性的真实性。我甚至会使用in运算符
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)) {...

1
为什么你使用这么多下划线? - Bergi
@Bergi - 我有点在作用域中“标记”变量为私有。这样就更容易不将它们与外部作用域中的变量混淆了。 - Björn
1
请勿使用 typeof void 0(或 typeof _undef),而是使用 "undefined" - Bergi
1
@Björn:这对我来说没有任何意义。使用var关键字声明它们为局部变量,不需要下划线。下划线主要用于半私有(但实际上是公开的)属性 - Bergi
1
@sheidaei - 我的模块中经常有未定义的变量,可能是我的坏习惯。 - Björn
显示剩余3条评论

0

值得一提的是,可以查看underscore对此功能的实现。如果你只是想消除重复项,可以使用_.uniq(),但如果你更关心是否存在重复项或纯粹的实现细节,那么你可能会喜欢查看这个方法的源代码,它有非常好的文档。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接