我需要确定数组中是否存在值.
我使用以下功能:
Array.prototype.contains = function(obj) { var i = this.length; while (i--) { if (this[i] == obj) { return true; } } return false; }
上面的函数总是返回false.
数组值和函数调用如下:
arrValues = ["Sam","Great", "Sample", "High"] alert(arrValues.contains("Sam"));
eyelidlessne.. 996
var contains = function(needle) { // Per spec, the way to identify NaN is that it is not equal to itself var findNaN = needle !== needle; var indexOf; if(!findNaN && typeof Array.prototype.indexOf === 'function') { indexOf = Array.prototype.indexOf; } else { indexOf = function(needle) { var i = -1, index = -1; for(i = 0; i < this.length; i++) { var item = this[i]; if((findNaN && item !== item) || item === needle) { index = i; break; } } return index; }; } return indexOf.call(this, needle) > -1; };
你可以像这样使用它:
var myArray = [0,1,2], needle = 1, index = contains.call(myArray, needle); // true
CodePen验证/使用
var contains = function(needle) { // Per spec, the way to identify NaN is that it is not equal to itself var findNaN = needle !== needle; var indexOf; if(!findNaN && typeof Array.prototype.indexOf === 'function') { indexOf = Array.prototype.indexOf; } else { indexOf = function(needle) { var i = -1, index = -1; for(i = 0; i < this.length; i++) { var item = this[i]; if((findNaN && item !== item) || item === needle) { index = i; break; } } return index; }; } return indexOf.call(this, needle) > -1; };
你可以像这样使用它:
var myArray = [0,1,2], needle = 1, index = contains.call(myArray, needle); // true
CodePen验证/使用
jQuery有一个实用功能:
$.inArray(value, array)
返回value
in的索引array
.-1
如果array
不包含则返回value
.
另请参阅如何检查数组是否包含JavaScript中的对象?
这通常是indexOf()方法的用途.你会说:
return arrValues.indexOf('Sam') > -1
在ES2016中,有Array.prototype.includes()
.
该
includes()
方法确定数组是否包括某个元素,返回true
或false
适当.
["Sam", "Great", "Sample", "High"].includes("Sam"); // true
据kangax和MDN称,支持以下平台:
Chrome 47
边缘14
Firefox 43
歌剧34
Safari 9
节点6
可以使用Babel(使用babel-polyfill
)或扩展支持core-js
.MDN还提供了polyfill:
if (![].includes) { Array.prototype.includes = function(searchElement /*, fromIndex*/ ) { 'use strict'; var O = Object(this); var len = parseInt(O.length) || 0; if (len === 0) { return false; } var n = parseInt(arguments[1]) || 0; var k; if (n >= 0) { k = n; } else { k = len + n; if (k < 0) {k = 0;} } var currentElement; while (k < len) { currentElement = O[k]; if (searchElement === currentElement || (searchElement !== searchElement && currentElement !== currentElement)) { return true; } k++; } return false; }; }
因为跨浏览器兼容性和效率的所有问题,使用像lodash这样的库几乎总是更安全.
效率是因为可以保证在任何给定时间,像下划线这样非常受欢迎的库将具有完成这样的实用功能的最有效方法.
_.includes([1, 2, 3], 3); // returns true
如果您担心通过包含整个库而添加到应用程序中的批量,请知道您可以单独包含功能:
var includes = require('lodash/collections/includes');
注意:对于旧版本的lodash,这_.contains()
不是_.includes()
.
TL;博士
function includes(k) { for(var i=0; i < this.length; i++){ if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){ return true; } } return false; }
例
function includes(k) {
for(var i=0; i < this.length; i++){
if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
return true;
}
}
return false;
}
function log(msg){
$('#out').append('' + msg + '');
}
var arr = [1, "2", NaN, true];
arr.includes = includes;
log('var arr = [1, "2", NaN, true];');
log('
');
log('arr.includes(1): ' + arr.includes(1));
log('arr.includes(2): ' + arr.includes(2));
log('arr.includes("2"): ' + arr.includes("2"));
log('arr.includes(NaN): ' + arr.includes(NaN));
log('arr.includes(true): ' + arr.includes(true));
log('arr.includes(false): ' + arr.includes(false));
#out{
font-family:monospace;
}
从ECMAScript6开始,可以使用Set
:
var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
我的小贡献:
function isInArray(array, search) { return array.indexOf(search) >= 0; } //usage if(isInArray(my_array, "my_value")) { //... }
鉴于IE的indexOf的实现(如eyelidlessness所述):
Array.prototype.contains = function(obj) { return this.indexOf(obj) > -1; };
如果您可以访问ECMA 5,则可以使用某种方法.
MDN一些方法链接
arrValues = ["Sam","Great", "Sample", "High"]; function namePresent(name){ return name === this.toString(); } // Note: // namePresent requires .toString() method to coerce primitive value // i.e. String {0: "S", 1: "a", 2: "m", length: 3, [[PrimitiveValue]]: "Sam"} // into // "Sam" arrValues.some(namePresent, 'Sam'); => true;
如果您有权访问ECMA 6,则可以使用包含方法.
MDN包含方法链接
arrValues = ["Sam","Great", "Sample", "High"]; arrValues.includes('Sam'); => true;
您可以使用_.indexOf方法,或者如果您不想在应用程序中包含整个Underscore.js库,您可以查看它们是如何做到的并提取必要的代码.
_.indexOf = function(array, item, isSorted) { if (array == null) return -1; var i = 0, l = array.length; if (isSorted) { if (typeof isSorted == 'number') { i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted); } else { i = _.sortedIndex(array, item); return array[i] === item ? i : -1; } } if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); for (; i < l; i++) if (array[i] === item) return i; return -1; };
另一种选择是以下列方式使用Array.some
(如果可用):
Array.prototype.contains = function(obj) { return this.some( function(e){ return e === obj } ); }
传递给的匿名函数Array.some
将返回true
当且仅当数组中的元素与...相同时obj
.如果没有这样的元素,函数将不会返回true
数组的任何元素,因此Array.some
也将返回false
.
哇,这个问题有很多很棒的答案.
我没有看到一个采取reduce
方法,所以我将其添加:
var searchForValue = 'pig'; var valueIsInArray = ['horse', 'cat', 'dog'].reduce(function(previous, current){ return previous || searchForValue === current ? true : false; }, false); console.log('The value "' + searchForValue + '" is in the array: ' + valueIsInArray);
这是它在行动中的一个小提琴.
提供的答案对我不起作用,但给了我一个主意:
Array.prototype.contains = function(obj) { return (this.join(',')).indexOf(obj) > -1; }
这不是完美的,因为超出分组的相同项目最终可能会匹配。如我的例子
var c=[]; var d=[]; function a() { var e = '1'; var f = '2'; c[0] = ['1','1']; c[1] = ['2','2']; c[2] = ['3','3']; d[0] = [document.getElementById('g').value,document.getElementById('h').value]; document.getElementById('i').value = c.join(','); document.getElementById('j').value = d.join(','); document.getElementById('b').value = c.contains(d); }
当我分别使用包含1和2的'g'和'h'字段调用此函数时,它仍然可以找到它,因为联接产生的字符串为:1,1,2,2,3,3
由于在我的情况下我会遇到这种情况值得怀疑,所以我正在使用它。我以为可以分享,以防别人也无法使所选答案起作用。