2011-03-15 49 views
0

我有對象gAllMedicalFilesClaimantsArray與2-屬性(用戶ID &的UserInfo)什麼是檢查使用jquery或Javascript

例如陣列陣列中是否存在特定的用戶ID的最快方式:

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

使用Jquery或Javascript檢查數組中是否存在特定UserID的最快方法是什麼,因爲gAllMedicalFilesClaimantsArray已經有8000條記錄?

感謝

+0

從HTTP:/ /jquery.com/:「jQuery是一個快速簡潔的JavaScript庫」...如果您使用jQuery遍歷數組,您實際上正在使用一個JavaScript – 2011-03-15 16:50:16

+0

@PiotrSalaciak我是否也使用JavaScript? – Raynos 2011-03-15 16:57:28

+0

對不起,但我必須問:您沒有向使用此頁面的每個用戶發送8000+用戶的陣列,對嗎? – some 2011-03-15 17:31:53

回答

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

'for in'在性能上糟糕透了(對於JavaScript)。使用常規循環技術更好。 – Haochi 2011-03-15 18:01:04

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; 
} 

由用戶名排序的數組?如果是這樣,可以通過使用二進制搜索進一步改進;這會將此從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; 
} 
+0

如果你有時間,無論如何都會看到實現。 – 2011-03-15 16:49:36

+0

你可以做一個for(var數組),而不是無論如何都不需要k。如果你想知道它存在的確切點,那麼讓k在那裏會有好處,儘管 – Harold 2011-03-15 16:53:43

+1

@Harold a在檢查時速度較慢。一個標準的前向循環會比後向循環更快。 – Raynos 2011-03-15 16:56:30

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

您可以通過該數組排序使用二進制搜索算法固定搜索過程(例如對於用戶ID)。

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); 
+0

好的想法。我在 – Harold 2011-03-15 16:54:37

-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'); 
+0

這個問題中錯過了'最快'的方式。改變內置對象的原型是一種非常糟糕的做法,因爲您更改了該類型的所有對象。將函數直接添加到'gAllMedicalFilesClaimantsArray'會好得多。 (這個「規則」有一個例外:如果你添加了當前javascript引擎缺少的標準功能,但這就是jquery和類似庫的用處) – some 2011-03-15 20:47:06

+0

@some真正的問題是當你擴展Object.prototype時,因爲你必須過濾出繼承的屬性(擴展名)。只要你不使用for循環遍歷一個數組,這是不推薦的,因爲不能保證屬性的順序。 – 2012-07-27 04:20:31

+0

@JuanMendes對。但是,像這樣擴展內置對象就像使用全局變量一樣:它通常有效,但通常有更好的方法來實現它。關於在Object.prototype中添加內容:使用Object.defineProperty,應該可以添加不可枚舉的屬性。斯卡里。 – some 2012-07-27 04:50:35

相關問題