如何检查数组是否包含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。
其他一些框架提供了类似的方法:
- Dojo Toolkit:
dojo.indexOf(array, value, [fromIndex, findLast])
- 原型:
array.indexOf(value)
- MooTools:
array.indexOf(value)
- Mochiki t:z zxswい
- MS Ajax:
findValue(array, value)
- Ext:
array.indexOf(value)
- Lodash:
Ext.Array.contains(array, value)
(之前是_.includes(array, value, [from])
4.0.0) - ECMAScript 2016:
_.contains
请注意,某些框架将此实现为函数,而其他框架则将该函数添加到数组原型中。
开箱即用,如果您多次拨打此电话,使用效率会大大提高 关联数组 使用哈希函数进行查找的Map。
一内胆:
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输出(所以基本上contains
与true
和index
与false
)。这不应该伤害它。
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。否则,我认为你最终会得到类似于原始代码的东西。
如果您反复检查数组中是否存在对象,您应该查看
- 通过在数组中执行Array.indexOf来保持数组始终排序(将新对象放在正确的位置)
- 将对象更新为删除+排序插入操作和
- 在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 中的值检查对象是不是在数组中?