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;
}

...