使用Jquery或Javascript检查数组中是否存在特定UserID的最快方法是什么

时间:2011-03-15 16:42:52

标签: javascript jquery

我有一个包含2个属性的对象数组gAllMedicalFilesClaimantsArray(UserID& UserInfo)

例如:

gAllMedicalFilesClaimantsArray[0].UserID = "111"; 
gAllMedicalFilesClaimantsArray[0].UserInfo = "AAA-111";
gAllMedicalFilesClaimantsArray[1].UserID = "222"; 
gAllMedicalFilesClaimantsArray[1].UserInfo = "BDD-478333";

使用Jquery或Javascript检查数组中是否存在特定UserID的最快方法是什么,因为gAllMedicalFilesClaimantsArray有8000条记录?

由于

5 个答案:

答案 0 :(得分:1)

这样的事情,我相信:

function exists(uid) {
    var k = gAllMedicalFilesClaimantsArray.length;
    uid = uid.toString(); // ensure the arg is a str (this can be omitted)
    while (k--) {
        if (gAllMedicalFilesClaimantsArray[k].UserID === uid) {
            return true;
        }
    }
    return false;
}

数组是否按UserID排序?如果是这样,可以通过二进制搜索进一步改进;这将把它从O(n)改为O(log n)。你的例子表明它是。我在网上用JavaScript here找到了一个很好的二进制搜索实现方法。如果网站死了,这是代码:

function binarySearch(items, value){

    var startIndex  = 0,
        stopIndex   = items.length - 1,
        middle      = Math.floor((stopIndex + startIndex)/2);

        while(items[middle] != value && startIndex < stopIndex){

        //adjust search area
        if (value < items[middle]){
            stopIndex = middle - 1;
        } else if (value > items[middle]){
            startIndex = middle + 1;
        }

        //recalculate middle
        middle = Math.floor((stopIndex + startIndex)/2);
    }

    //make sure it's the right value
    return (items[middle] != value) ? -1 : middle;
}

答案 1 :(得分:1)

var match = '222';
var matches = $.grep(myArray, function(el, index) {
   return (el.UserID === match);
});

答案 2 :(得分:1)

如果数组已排序(例如,相对于UserId),您可以使用二进制搜索算法来固定搜索过程。

function binarySearch(array, userid) {
  var low = 0, high = array.length - 1,
      i, comparison;
  while (low <= high) {
    i = parseInt((low + high) / 2, 10);

    if (array[i].UserId < userid) { low = i + 1; continue; };
    if (array[i].UserId > userid) { high = i - 1; continue; };
    return array[i];
  }
  return null;
};

您可以使用以下功能找到ID为12的用户:

var result = binarySearch(gAllMedicalFilesClaimantsArray, 12);

答案 3 :(得分:0)

ExistsInArray(value, array){
    for(var item in array){
        if(item.UserId == value){
            return true;
        }
    }
    return false;
}

答案 4 :(得分:-1)

您可以将Array对象原型化,如下所示:

Array.prototype.exists = function(value, prop){
    var i = null;
    for (i in this)
        if (this[i][prop] && this[i][prop] == value)
            return true;
    return false;
}

gAllMedicalFilesClaimantsArray.exists('222', 'UserID');