当前位置:  开发笔记 > 编程语言 > 正文

确定数组是否包含值

如何解决《确定数组是否包含值》经验,为你挑选了14个好方法。

我需要确定数组中是否存在值.

我使用以下功能:

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验证/使用



1> eyelidlessne..:
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验证/使用


你应该使用与`===`的类型比较来与本机实现兼容
@RiceFlourCookies,IE <9.
这个答案指的是什么版本的IE?
请注意,数组上的indexOf未在IE中实现,但您可以自己定义它
修复了比较并添加了缺失的`return -1`; 请注意,根据ES5规范,在有符号的零和NaN的情况下,此方法的行为将与原生方法不同(见15.4.4.14和9.12对11.9.6)
请注意,在Sharepoint 2010中,如果实现Array.Prototype,WebParts可能会中断:http://labs.steveottenad.com/type-mismatch-on-wpadder-js/

2> codeape..:

jQuery有一个实用功能:

$.inArray(value, array)

返回valuein的索引array.-1如果array不包含则返回value.

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


不要让"inArray"这个名字欺骗你.如上所述(但当然我没有仔细阅读),如果元素不存在,则返回-1*(非假)*.
'inArray'意味着将返回一个布尔值,指示是否可以在数组中找到该元素.因此,用户可能会想要使用表达式:if($ .inArray('myval',myarray)){...}如果'myval'不在myarray中,这将评估为true.此外,如果myval的索引为0,它将评估为false.
`$ .inArray`返回的非布尔值肯定感觉就像是jQuery的一个错误.当然,它应该被重命名为`$ .indexOf`,如果这是它的填充函数?
很容易建议有人使用JQuery方法处理所有javascript,但由于最初的问题是针对javascript解决方案,因此应该以这种方式提供
@Steve Paul名字有什么问题?它做了它所说的:-1 =它不在那里,其他任何东西=它就在那里
Works,但需要jQuery框架.如果您不使用它,则不理想.
不适合'NaN`

3> Gabriel Hurl..:

这通常是indexOf()方法的用途.你会说:

return arrValues.indexOf('Sam') > -1


`indexOf`在我喜欢Kenneth J的评论比答案更多的赞成.但好东西 - 我已经将indexOf()用于字符串,但我不知道你可以将它用于数组.
如果数组中不存在元素,`return~arrValues.indexOf('Sam')`将返回`false`
@SebastianMach,如果所有网络开发人员都采取立场说不......用户将被迫改变.并且帮助公司省钱,因为他们不必雇用IE开发人员

4> Dale..:
Array.prototype.includes()

在ES2016中,有Array.prototype.includes().

includes()方法确定数组是否包括某个元素,返回truefalse适当.

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


我很想在几个关于多个变量值或数组的javascript问题中发布这个答案.来自MDN的polyfill非常好.
谢谢你!Babel polyfils很好:-)我记得2年前jQuery在任何项目中,现在它是Babel :) JavaScript社区的大赢家!在许多平台上已经有了ES7可用的表格,包括babel pollyfils http://kangax.github.io/compat-table/es2016plus/

5> ncabral..:

因为跨浏览器兼容性和效率的所有问题,使用像lodash这样的库几乎总是更安全.

效率是因为可以保证在任何给定时间,像下划线这样非常受欢迎的库将具有完成这样的实用功能的最有效方法.

_.includes([1, 2, 3], 3); // returns true

如果您担心通过包含整个库而添加到应用程序中的批量,请知道您可以单独包含功能:

var includes = require('lodash/collections/includes');

注意:对于旧版本的lodash,这_.contains()不是_.includes().


仅供参考:使用lodash 4,它现在是`_.includes()`而不是`_.contains()`.
@threed,您不必包含整个库.部分功能可以包含在require('lodash/collections/contains')中.

6> Trevor..:

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



7> Nicolas..:

从ECMAScript6开始,可以使用Set:

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false



8> Matías Cánep..:

我的小贡献:

function isInArray(array, search)
{
    return array.indexOf(search) >= 0;
}

//usage
if(isInArray(my_array, "my_value"))
{
    //...
}



9> rlovtang..:

鉴于IE的indexOf的实现(如eyelidlessness所述):

Array.prototype.contains = function(obj) {
    return this.indexOf(obj) > -1;
};


也许,但它会使你的代码更清晰.if(myArray.contains(obj))更容易阅读并且比if(myArray.indexOf(obj)> -1)更好地陈述意图.我明确地将两者都实施.
那是多余的.

10> SoEzPz..:

如果您可以访问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;



11> Wojciech Bed..:

您可以使用_.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;
  };



12> Hunan Rostom..:

另一种选择是以下列方式使用Array.some(如果可用):

Array.prototype.contains = function(obj) {
  return this.some( function(e){ return e === obj } );
}

传递给的匿名函数Array.some将返回true当且仅当数组中的元素与...相同时obj.如果没有这样的元素,函数将不会返回true数组的任何元素,因此Array.some也将返回false.



13> Chris Schmit..:

哇,这个问题有很多很棒的答案.

我没有看到一个采取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);

这是它在行动中的一个小提琴.



14> 小智..:

提供的答案对我不起作用,但给了我一个主意:

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

由于在我的情况下我会遇到这种情况值得怀疑,所以我正在使用它。我以为可以分享,以防别人也无法使所选答案起作用。

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有