找出JavaScript數組是否包含值的最簡潔,最有效的方法是什麼? javascript
這是我知道的惟一方法: html
function contains(a, obj) { for (var i = 0; i < a.length; i++) { if (a[i] === obj) { return true; } } return false; }
有沒有更好,更簡潔的方法來實現這一目標? java
這與Stack Overflow問題密切相關。 在JavaScript數組中查找項目的最佳方法? 它解決了使用indexOf
在數組中查找對象的問題。 jquery
雖然array.indexOf(x)!=-1
是執行此操做的最簡潔方法(而且已由非Internet Explorer瀏覽器支持了十多年...),但它不是O(1),而是O( N),這很糟糕。 若是您的數組不會改變,則能夠將其轉換爲哈希表,而後執行table[x]!==undefined
或===undefined
: git
Array.prototype.toTable = function() { var t = {}; this.forEach(function(x){t[x]=true}); return t; }
演示: github
var toRemove = [2,4].toTable(); [1,2,3,4,5].filter(function(x){return toRemove[x]===undefined})
(不幸的是,雖然您能夠建立一個Array.prototype.contains來「凍結」一個數組並將哈希表存儲在兩行中的this._cache中,可是若是您之後選擇編輯數組,則會產生錯誤的結果。JavaScript的鉤子不足讓您保持這種狀態,例如與Python不一樣。) ajax
function inArray(elem,array) { var len = array.length; for(var i = 0 ; i < len;i++) { if(array[i] == elem){return i;} } return -1; }
若是找到,則返回數組索引;若是未找到,則返回-1 api
擴展JavaScript Array
對象是一個很是糟糕的主意,由於您在for-in
循環中引入了新屬性(您的自定義方法) for-in
這可能會破壞現有腳本。 幾年前, 原型庫的做者不得不從新設計其庫實現,以刪除此類內容。 數組
若是您沒必要擔憂與頁面上運行的其餘JavaScript的兼容性,請堅持下去,不然,我建議您使用更笨拙但更安全的獨立功能解決方案。 瀏覽器
這是Prototype的工做方式 :
/** * Array#indexOf(item[, offset = 0]) -> Number * - item (?): A value that may or may not be in the array. * - offset (Number): The number of initial items to skip before beginning the * search. * * Returns the position of the first occurrence of `item` within the array — or * `-1` if `item` doesn't exist in the array. **/ function indexOf(item, i) { i || (i = 0); var length = this.length; if (i < 0) i = length + i; for (; i < length; i++) if (this[i] === item) return i; return -1; }
另請參閱此處 ,瞭解他們如何進行鏈接。
當前的瀏覽器有Array#includes
,這正是這麼作的, 獲得普遍支持 ,並具備填充工具舊版本瀏覽器。
> ['joe', 'jane', 'mary'].includes('jane'); true
您還可使用Array#indexOf
,它不太直接,但對於過時的瀏覽器不須要Polyfills。
jQuery提供$.inArray
,在功能上等效於Array#indexOf
。
underscore.js是一個JavaScript實用程序庫,提供_.contains(list, value)
和別名_.include(list, value)
,若是傳遞了JavaScript數組,則二者都在內部使用indexOf 。
其餘一些框架提供了相似的方法:
dojo.indexOf(array, value, [fromIndex, findLast])
array.indexOf(value)
array.indexOf(value)
findValue(array, value)
: findValue(array, value)
array.indexOf(value)
Ext.Array.contains(array, value)
_.includes(array, value, [from])
(是_.contains
4.0.0以前的版本) R.includes(value, array)
: R.includes(value, array)
array.includes(value)
注意,有些框架將此功能實現爲函數,而其餘框架則將該函數添加到數組原型中。