javascript - 有什麼好辦法來查找javaScript數組中元素?

  显示原文与译文双语对照的内容

可能重複:
array.contains(obj) 中

如果一個對象在數組中,最好的方法是什麼?

這是我知道的最好方法:


function include(arr, obj) {
 for(var i=0; i<arr.length; i++) {
 if (arr[i] == obj) return true;
 }
}

include([1,2,3,4], 3);//true
include([1,2,3,4], 6);//undefined

时间:


function include(arr,obj) {
 return (arr.indexOf(obj)!= -1);
}

編輯:這不能在 IE6,7或者 8上工作。 最好的解決辦法是自己定義它,如果它不存在:

  1. 的mozilla ( ECMA-262 )汾?

    
     if (!Array.prototype.indexOf)
     {
    
     Array.prototype.indexOf = function(searchElement/*, fromIndex */)
    
     {
    
    
    "use strict";
    
     if (this === void 0 || this === null)
     throw new TypeError();
    
     var t = Object(this);
     var len = t.length>> > 0;
     if (len === 0)
     return -1;
    
     var n = 0;
     if (arguments.length> 0)
     {
     n = Number(arguments[1]);
     if (n!== n)
     n = 0;
     else if (n!== 0 && n!== (1/0) && n!== -(1/0))
     n = (n> 0 || -1) * Math.floor(Math.abs(n));
     }
    
     if (n> = len)
     return -1;
    
     var k = n> = 0
    ? n
     : Math.max(len - Math.abs(n), 0);
    
     for (; k <len; k++)
     {
     if (k in t && t[k] === searchElement)
     return k;
     }
     return -1;
     };
    
    }
    
    
  2. Daniel James的版本:

    
    if (!Array.prototype.indexOf) {
     Array.prototype.indexOf = function (obj, fromIndex) {
     if (fromIndex == null) {
     fromIndex = 0;
     } else if (fromIndex <0) {
     fromIndex = Math.max(0, this.length + fromIndex);
     }
     for (var i = fromIndex, j = this.length; i <j; i++) {
     if (this[i] === obj)
     return i;
     }
     return -1;
     };
    }
    
    
  3. roosteronacid 。exe版本:

    
    Array.prototype.hasObject = (
    !Array.indexOf? function (o)
     {
     var l = this.length + 1;
     while (l -= 1)
     {
     if (this[l - 1] === o)
     {
     return true;
     }
     }
     return false;
     } : function (o)
     {
     return (this.indexOf(o)!== -1);
     }
    );
    
    

首先,在JavaScript中實現 indexOf,對於沒有它的瀏覽器。 例如,看到erik一系列arvidsson額外 ( 同時,相關的博客文章 ) 。 然後你可以使用 indexOf 而不用擔心瀏覽器支持。 這是一個稍微優化的indexOf 實現版本:


if (!Array.prototype.indexOf) {
 Array.prototype.indexOf = function (obj, fromIndex) {
 if (fromIndex == null) {
 fromIndex = 0;
 } else if (fromIndex <0) {
 fromIndex = Math.max(0, this.length + fromIndex);
 }
 for (var i = fromIndex, j = this.length; i <j; i++) {
 if (this[i] === obj)
 return i;
 }
 return -1;
 };
}

它被修改為存儲長度,這樣它就不需要每次迭代都查找它。 但差異並不是巨大的。 一個不太通用的函數可能會更快:


var include = Array.prototype.indexOf?
 function(arr, obj) { return arr.indexOf(obj)!== -1; } :
 function(arr, obj) {
 for(var i = -1, j = arr.length; ++i <j;)
 if(arr[i] === obj) return true;
 return false;
 };

我更喜歡使用標準函數,當它真正需要的時候,將它的保留為 micro-optimization 。 但如果你是喜歡micro-optimization了我改編了 roosterononacid鏈接要在評論中,以基準測試基準測試,搜索在數組 。 在不同places,這兩個概念原油當然全面調查將測試它的陣列,不同類型,不同的長度和查找對象包含了 tube

假設. indexOf() 被實現可以實現類似於 obj.hasOwnProperty(prop )的東西


Object.defineProperty( Array.prototype,'has',
 {
 value:function(o){return this.indexOf(o)!=-1},
//writable:false,
//enumerable:false
 }
 )

現在這個新方法可以像


[22, 'a', {prop:'x'}].has(12) 

返回假

這取決於你的目的。 如果你為站點編寫程序,請避免 indexOf,IE 6 ( 他們中的許多仍然使用) 不支持它,或者有條件使用: !


if (yourArray.indexOf!== undefined) result = yourArray.indexOf(target);
else result = customSlowerSearch(yourArray, target);

indexOf 可能是用本機代碼編寫的,所以它比你在 JavaScript ( 除非數組合適,否則二進位搜索/二分法除外) 中可以做的任何事情都要快。 注意:這是一個品味問題,但是我會在你的常式末尾做一個 return false;,返回一個真正的布爾值。

一個健壯的方法來檢查一個對象是否是javascript中的數組,具體如下:

下面是 xa.js 框架的兩個函數,我將它們附加到 utils = {}'容器'。 這些可以幫助你正確地檢測數組。


var utils = {};

/**
 * utils.isArray
 *
 * Best guess if object is an array.
 */
utils.isArray = function(obj) {
//do an instanceof check first
 if (obj instanceof Array) {
 return true;
 }
//then check for obvious falses
 if (typeof obj!== 'object') {
 return false;
 }
 if (utils.type(obj) === 'array') {
 return true;
 }
 return false;
 };

/**
 * utils.type
 *
 * Attempt to ascertain actual object type.
 */
utils.type = function(obj) {
 if (obj === null || typeof obj === 'undefined') {
 return String (obj);
 }
 return Object.prototype.toString.call(obj)
. replace(/[object ([a-zA-Z]+)]/, '$1').toLowerCase();
};

如果你想檢查一個對象是否在數組中,我還將包括以下代碼:


/**
 * Adding hasOwnProperty method if needed.
 */
if (typeof Object.prototype.hasOwnProperty!== 'function') {
 Object.prototype.hasOwnProperty = function (prop) {
 var type = utils.type(this);
 type = type.charAt(0).toUpperCase() + type.substr(1);
 return this[prop]!== undefined
 && this[prop]!== window[type].prototype[prop];
 };
}

最後這個in_array函數:


function in_array (needle, haystack, strict) {
 var key;

 if (strict) {
 for (key in haystack) {
 if (!haystack.hasOwnProperty[key]) continue;

 if (haystack[key] === needle) {
 return true;
 }
 }
 } else {
 for (key in haystack) {
 if (!haystack.hasOwnProperty[key]) continue;

 if (haystack[key] == needle) {
 return true;
 }
 }
 }

 return false;
}

...