如何檢查數組是否在JavaScript中包含值?

找出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


#1樓

雖然array.indexOf(x)!=-1是執行此操做的最簡潔方法(而且已由非Internet Explorer瀏覽器支持了十多年...),但它不是O(1),而是O( N),這很糟糕。 若是您的數組不會改變,則能夠將其轉換爲哈希表,而後執行table[x]!==undefined===undefinedgit

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


#2樓

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


#3樓

擴展JavaScript Array對象是一個很是糟糕的主意,由於您在for-in循環中引入了新屬性(您的自定義方法) for-in這可能會破壞現有腳本。 幾年前, 原型庫的做者不得不從新設計其庫實現,以刪除此類內容。 數組

若是您沒必要擔憂與頁面上運行的其餘JavaScript的兼容性,請堅持下去,不然,我建議您使用更笨拙但更安全的獨立功能解決方案。 瀏覽器


#4樓

這是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 &mdash; 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;
}

另請參閱此處 ,瞭解他們如何進行鏈接。


#5樓

當前的瀏覽器有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

其餘一些框架提供了相似的方法:

注意,有些框架將此功能實現爲函數,而其餘框架則將該函數添加到數組原型中。

相關文章
相關標籤/搜索