2014-10-16 66 views
0

我的數組:檢查是否在數組中存在元素,而無需通過它遍歷

tempListArray = "[{"id":"12","value":false},{"id":"10","value":false},{"id":"9","value":false},{"id":"8","value":false}]"; 

要檢查元素是否存在,我會做到這一點:

for (var i in tempListArray) { 
    //check flag 
    if (tempListArray[i].id == Id) { 
     flagExistsLoop = 1; 
     break; 
    } 
} 

反正是有,我可以檢查是否有Id不存在循環遍歷整個數組。如果說我有100個元素,基本上我擔心表現。

感謝

+1

100元?這沒什麼。不要擔心。 – elclanrs 2014-10-16 21:52:35

+1

'for ... in'循環是迭代數組的不好方法。 – Oriol 2014-10-16 21:54:19

回答

2

不,不使用自定義詞典對象(你真的不想要這個)有沒有比做「全面掃描」所有的包含的對象更快的方式。

作爲一般經驗法則,不要擔心任何語言或任何情況下的性能,直到迭代的總次數達到5位數,最常見的是6或7.掃描一個包含100個元素的表應該是幾毫秒最壞的情況。擔心性能影響之前您有注意到性能影響是worst kinds of premature optimization之一。

+0

它取決於您正在運行它的設備嗎?我正在測試移動設備上的for循環 – bobo2000 2014-10-17 00:12:53

+0

確定設備很重要,但可以肯定地說任何現代移動設備都應該在一秒鐘內迭代100個陣列項目。 – dave 2014-10-17 04:29:11

+1

任何現代移動設備都應該在*十分之一秒的時間內完成* 100 *個陣列項目的迭代。 – 2014-10-17 06:46:38

0

嘗試使用php.js它可以幫助您同時可以使用相同的PHP函數的名稱和它有一些有用的功能

0

有沒有辦法不通過迭代元素(這將是魔法)。

但是,您可以考慮使用對象而不是數組。該對象將使用(可能是唯一的)id值作爲關鍵字,並且該值可能與您現在具有相同的結構(或沒有多餘的id屬性)。這樣,您可以高效地確定id是否已經存在。

+0

它最初是一個JSON對象,我需要解析成一個數組。我感興趣的是ID。是否值得查找JSON字符串中的ID是否與ID匹配 – bobo2000 2014-10-16 21:58:17

+0

如果您必須解析整個字符串,那麼確實沒有問題,是嗎?無論如何,你將不得不查看所有數據,所以在解析過程中進行檢查。 或者,你是從一個JSON對象開始的嗎?在*那*情況下,使用現有的對象做檢查(並且您仍然沒有真正的問題)。 – cybersam 2014-10-16 21:59:53

2

不,你不知道沒有迭代數組。

但是,請注意for...in循環是迭代陣列的好方法:

  • 沒有保證,它會遍歷數組與秩序
  • 它也將遍歷(枚舉)非數字自己的屬性
  • 它也會迭代(枚舉)來自原型的屬性,即在Array.prototypeObject.protoype中定義的屬性。

我會用其中的一個:

  • for環路與數字索引:

    for (var i=0; i<tempListArray.length; ++i) { 
        if (tempListArray[i].id == Id) { 
         flagExistsLoop = 1; 
         break; 
        } 
    } 
    
  • Array.prototype.some(EcmaScript的5):

    var flagExistsLoop = tempListArray.some(function(item) { 
        return item.id == Id; 
    }); 
    

    注意它可能會比th慢其他的因爲它在每一步調用一個函數。

  • for...of環(EcmaScript的6):

    for (var item of tempListArray) { 
        if (item.id == Id) { 
         flagExistsLoop = 1; 
         break; 
        } 
    } 
    
0

根據您的情況,您可以使用Array.indexOf()將返回-1,如果該項目不存在。

當然,它可能是在後臺迭代,但代碼更清潔。還要注意如何在javascript中完成對象比較,其中兩個對象即使它們的值可能相等也不相等。請看下圖:

var tempListArray = [{"id":"12","value":false},{"id":"10","value":false},{"id":"9","value":false},{"id":"8","value":false}]; 
 

 
var check1 = tempListArray[2]; 
 
var check2 = {"id":"9","value":false}; 
 

 
doCheck(tempListArray, check1); 
 
doCheck(tempListArray, check2); 
 

 
function doCheck(array, item) { 
 
    var index = array.indexOf(item); 
 
    
 
    if (index === -1) 
 
    document.write("not in array<br/>"); 
 
    else 
 
    document.write("exists at index " + index + "<br/>"); 
 
}

+0

是array.indexOf比for循環更快嗎? – bobo2000 2014-10-17 00:11:10

+0

不,對於循環與'indexOf()',性能應該是相等的。 'indexOf()'的好處是代碼的簡單性和可讀性,更不用說它是一行而不是幾行。 – dave 2014-10-17 04:20:11