如何检查数组是否包含JavaScript中的对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查数组是否包含JavaScript中的对象?相关的知识,希望对你有一定的参考价值。

找出javascript数组是否包含对象的最简洁有效的方法是什么?

这是我知道的唯一方法:

function contains(a, obj) 
    for (var i = 0; i < a.length; i++) 
        if (a[i] === obj) 
            return true;
        
    
    return false;

有没有更好,更简洁的方法来实现这一目标?

这与Stack Overflow问题Best way to find an item in a JavaScript Array?非常密切相关,它使用indexOf来寻找数组中的对象。

答案

目前的浏览器有Array#includes,它确实如此,is widely supported,并为旧浏览器提供polyfill

> ['joe', 'jane', 'mary'].includes('jane');
true 

您也可以使用Array#indexOf,它不是直接的,但不要求Polyfills用于过时的浏览器。

jQuery提供$.inArray,它在功能上等同于Array#indexOf

underscore.js是一个JavaScript实用程序库,提供_.contains(list, value),别名_.include(list, value),如果传递了JavaScript数组,它们都在内部使用indexOf

其他一些框架提供了类似的方法:

请注意,某些框架将此实现为函数,而其他框架则将该函数添加到数组原型中。

另一答案

开箱即用,如果您多次拨打此电话,使用效率会大大提高 关联数组 使用哈希函数进行查找的Map。

Prototype

另一答案

一内胆:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
另一答案

我使用以下内容:

function contains(arr, x) 
    return arr.filter(function(elem)  return elem == x ).length > 0;

另一答案
Array.prototype.contains = function (v) 
    return this.indexOf(v) > -1;


var a = [ 'foo', 'bar' ];

a.contains('foo'); // true
a.contains('fox'); // false

function contains(a, obj) return a.some(function(element)return element == obj;) 在第5版中被添加到ECMA-262标准中

另一答案

希望更快的双向Array.prototype.some() / indexOf替代品

2015

虽然新方法lastIndexOf非常好,但现在支持基本上为零。

很长一段时间我一直想着替换慢的indexOf / lastIndexOf函数。

已找到一种高效的方式,查看最佳答案。从那些我选择@Damir Zekic发布的includes函数应该是最快的。但它也表示基准测试是从2008年开始的,因此已经过时了。

我也更喜欢contains而不是while,但由于没有特殊原因,我结束了用for循环编写函数。它也可以用for完成。

我很好奇,如果我在做这个时检查数组的两侧,迭代速度要慢得多。显然不是,所以这个功能比最高投票的功能快两倍左右。显然它也比原生的更快。这在现实环境中,您永远不知道您正在搜索的值是在数组的开头还是结尾。

当你知道你刚推送一个带有值的数组时,使用lastIndexOf仍然可能是最好的解决方案,但是如果你必须通过大数组并且结果可能无处不在,那么这可能是一个可以让事情变得更快的可靠解决方案。

双向indexOf / lastIndexOf

while --

Performance test

function bidirectionalIndexOf(a, b, c, d, e) for(c=a.length,d=c*1; c--; ) if(a[c]==b) return c; //or this[c]===b if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b return -1 //Usage bidirectionalIndexOf(array,'value');

作为测试,我创建了一个包含100k条目的数组。

三个查询:在数组的开头,中间和末尾。

我希望你也发现这个有趣并测试性能。

注意:正如你所看到的,我稍微修改了http://jsperf.com/bidirectionalindexof函数以反映indexOf和lastIndexOf输出(所以基本上containstrueindexfalse)。这不应该伤害它。

The array prototype variant

-1

该函数也可以很容易地修改为返回true或false,甚至是对象,字符串或其他任何东西。

这是Object.defineProperty(Array.prototype,'bidirectionalIndexOf',value:function(b,c,d,e) for(c=this.length,d=c*1; c--; ) if(this[c]==b) return c; //or this[c]===b if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b return -1 ,writable:false, enumerable:false); // Usage array.bidirectionalIndexOf('value'); 变种:

while

How is this possible?

我认为在数组中获取反射索引的简单计算非常简单,它比实际循环迭代快两倍。

下面是一个复杂的示例,每次迭代执行三次检查,但这只能通过更长的计算才能实现,这会导致代码速度变慢。

function bidirectionalIndexOf(a, b, c, d) c=a.length; d=c-1; while(c--) if(b===a[c]) return c; if(b===a[d-c]) return d-c; return c // Usage bidirectionalIndexOf(array,'value');

另一答案

如果您使用的是JavaScript 1.6或更高版本(Firefox 1.5或更高版本),则可以使用http://jsperf.com/bidirectionalindexof/2。否则,我认为你最终会得到类似于原始代码的东西。

另一答案

如果您反复检查数组中是否存在对象,您应该查看

  1. 通过在数组中执行Array.indexOf来保持数组始终排序(将新对象放在正确的位置)
  2. 将对象更新为删除+排序插入操作和
  3. insertion sort中使用binary search查找。
另一答案
contains(a, obj)

如果找到则返回数组索引,如果未找到则返回-1

另一答案

我们使用这个片段(适用于对象,数组,字符串):

function inArray(elem,array)

    var len = array.length;
    for(var i = 0 ; i < len;i++)
    
        if(array[i] == elem)return i;
    
    return -1;
 

用法:

/*
 * @function
 * @name Object.prototype.inArray
 * @description Extend Object prototype within inArray function
 *
 * @param mix    needle       - Search-able needle
 * @param bool   searchInKey  - Search needle in keys?
 *
 */
Object.defineProperty(Object.prototype, 'inArray',
    value: function(needle, searchInKey)

        var object = this;

        if( Object.prototype.toString.call(needle) === '[object Object]' || 
            Object.prototype.toString.call(needle) === '[object Array]')
            needle = JSON.stringify(needle);
        

        return Object.keys(o

以上是关于如何检查数组是否包含JavaScript中的对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查数组是不是包含 JavaScript 中的值?

在javascript中搜索对象中的值[关闭]

如何根据 JavaScript 中的值检查对象是不是在数组中?

如何检查一个对象是不是至少包含一个键,其值包含 JavaScript 中的子字符串?

Javascript 中 检查一个数组是否包含某对象

如何检查一个字符串数组是不是包含 JavaScript 中的一个字符串? [复制]