2012-07-02 92 views
15

我有一個數組是:如何以非阻塞方式在Node.js中搜索數組?

[ 4ff023908ed2842c1265d9e4, 4ff0d75c8ed2842c1266099b ] 

而且我發現,如果下面是陣列

4ff0d75c8ed2842c1266099b 

這裏面是我寫的:

Array.prototype.contains = function(k) { 
    for(p in this) 
    if(this[p] === k) 
     return true; 
    return false; 
} 

顯然,它不能正常工作,或者有時它可以工作,但它在我看來阻塞。有沒有人可以檢查那個?

千恩萬謝

+3

「堵」?另外,不要用'for in'來迭代數組。無論如何,只要將它寫爲'this.indexOf(k)> -1' ... – Ryan

+0

這些ObjectId對象嗎? – JohnnyHK

+0

你對阻塞的定義是什麼?在Node中,它通常意味着「等待I/O完成」。 – Thilo

回答

32

非阻塞搜索功能

Array.prototype.contains = function(k, callback) { 
    var self = this; 
    return (function check(i) { 
     if (i >= self.length) { 
      return callback(false); 
     } 

     if (self[i] === k) { 
      return callback(true); 
     } 

     return process.nextTick(check.bind(null, i+1)); 
    }(0)); 
} 

用法:

[1, 2, 3, 4, 5].contains(3, function(found) { 
    if (found) { 
     console.log("Found"); 
    } else { 
     console.log("Not found"); 
    } 
}); 

然而,對於數組中搜索值最好是使用JavaScript內置陣列搜索功能,因爲它會快得多(所以你可能不需要它是非阻塞的):

if ([1, 2, 3, 4, 5].indexOf(3) >= 0) { 
    console.log("Found"); 
} else { 
    console.log("Not found"); 
} 

另外,還要考慮underscore庫,這使得所有的東西跨平臺:http://underscorejs.org/

+2

node.js - >只有一個平臺。只要你不需要在瀏覽器中運行它,你就不需要跨平臺兼容性。 – TheHippo

+1

但是,編寫跨平臺符合標準的代碼會更好,除非成本太高。 – penartur

+4

我認爲這有不同的方法。爲了提高性能,如果不需要跨平臺運行,我不寫跨平臺。 – TheHippo