首页 文章

确定数组是否包含值[duplicate]

提问于
浏览
1209

这个问题在这里已有答案:

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

我使用以下功能:

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"));

18 回答

  • 19
    function setFound(){   
     var l = arr.length, textBox1 = document.getElementById("text1");
        for(var i=0; i<l;i++)
        {
         if(arr[i]==searchele){
          textBox1 .value = "Found";
          return;
         }
        }
        textBox1 .value = "Not Found";
    return;
    }
    

    该程序检查是否找到给定元素 . Id text1表示文本框的id,searchele表示要搜索的元素(得到fron用户);如果你想要索引,请使用i值

  • 951

    如果您有权访问ECMA 5,则可以使用 some 方法 .

    MDN SOME Method Link

    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,则可以使用 includes 方法 .

    MDN INCLUDES Method Link

    arrValues = ["Sam","Great", "Sample", "High"];
    
    arrValues.includes('Sam');
    => true;
    
  • 17

    tl;dr

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

    Example

    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('<div>' + msg + '</div>');  
    }
    
    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;
    }
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div id=out></div>
    

    Longer Answer

    我知道这个问题并没有引用一篇文章来概括这个辩论,但是这个链接破了,我无法编辑原始评论,因为时间太长了,所以我把它包括在内了here .

    如果您希望使用 contains 方法扩展内置 Array 对象,可能最好也是最负责任的方法是使用MDN中的此polyfill . (另请参阅有关原型继承的MDN文章的this部分,其中解释了"The only good reason for extending a built-in prototype is to backport the features of newer JavaScript engines; for example Array.forEach, etc.")

    if (!Array.prototype.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;
      };
    }
    

    Don't want strict equality, or want to choose?

    function includes(k, strict) {
      strict = strict !== false; // default is true
      // strict = !!strict; // default is false
      for(var i=0; i < this.length; i++){
        if( (this[i] === k && strict) || 
            (this[i] == k && !strict) ||
            (this[i] !== this[i] && k !== k)
        ) {
          return true;
        }
      }
      return false;
    }
    
  • 4

    提供的答案对我不起作用,但它给了我一个想法:

    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

    由于我的情况值得怀疑,我会遇到这种情况,我正在使用它 . 我以为我会分享,其他人也不能让选择的答案工作 .

  • 969

    您可以使用_.indexOf method或者如果您不想在应用程序中包含整个Underscore.js库,您可以查看how they did it并提取必要的代码 .

    _.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;
      };
    
  • 7

    另一种选择是以下列方式使用 Array.someif available):

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

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

  • 1

    对于 contains 函数,最简单的解决方案是一个如下所示的函数:

    var contains = function (haystack, needle) {
        return !!~haystack.indexOf(needle);
    }
    

    理想情况下,您不会将其作为独立函数,而是帮助程序库的一部分:

    var helper = {};
    
    helper.array = {
        contains : function (haystack, needle) {
            return !!~haystack.indexOf(needle);
        }, 
        ...
    };
    

    现在,如果你碰巧是那些仍然需要支持IE <9并且因此不能依赖 indexOf 的那些不幸的人之一,你可以使用这个polyfill,我得到from the MDN

    if (!Array.prototype.indexOf) {
      Array.prototype.indexOf = function(searchElement, fromIndex) {
        var k;
        if (this == null) {
          throw new TypeError('"this" is null or not defined');
        }
        var o = Object(this);
        var len = o.length >>> 0;
        if (len === 0) {
          return -1;
        }
        var n = +fromIndex || 0;
    
        if (Math.abs(n) === Infinity) {
          n = 0;
        }
        if (n >= len) {
          return -1;
        }
        k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
        while (k < len) {
          if (k in o && o[k] === searchElement) {
            return k;
          }
          k++;
        }
        return -1;
      };
    }
    
  • 16

    从ECMAScript6开始,可以使用Set

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

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

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

    Here's a fiddle of it in action .

  • 9

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

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

    我的小贡献:

    function isInArray(array, search)
    {
        return array.indexOf(search) >= 0;
    }
    
    //usage
    if(isInArray(my_array, "my_value"))
    {
        //...
    }
    
  • 2

    jQuery有一个实用功能:

    $.inArray(value, array)
    

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

    另见How do I check if an array includes an object in JavaScript?

  • -5

    使用array .map函数为数组中的每个值执行一个函数对我来说似乎最干净 .

    参考:Array.prototype.map()

    此方法适用于简单数组和对象数组,您需要查看对象数组中是否存在键/值 .

    function inArray(myArray,myValue){
        var inArray = false;
        myArray.map(function(key){
            if (key === myValue){
                inArray=true;
            }
        });
        return inArray;
    };
    
    var anArray = [2,4,6,8]
    console.log(inArray(anArray, 8)); // returns true
    console.log(inArray(anArray, 1)); // returns false
    
    function inArrayOfObjects(myArray,myValue,objElement){
        var inArray = false;
        myArray.map(function(arrayObj){
            if (arrayObj[objElement] === myValue) {
                inArray=true;
            }
        });
        return inArray;
    };
    
    var objArray = [{id:4,value:'foo'},{id:5,value:'bar'}]
    console.log(inArrayOfObjects(objArray, 4, 'id')); // returns true
    console.log(inArrayOfObjects(objArray, 'bar', 'value')); // returns true
    console.log(inArrayOfObjects(objArray, 1, 'id')); // returns false
    
  • 11

    Array.prototype.includes()

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

    includes()方法确定数组是否包含某个元素,并根据需要返回true或false .

    示例

    ["Sam", "Great", "Sample", "High"].includes("Sam"); // true
    

    支持

    根据kangaxMDN,支持以下平台:

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

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

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

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

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

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

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

  • 34

    我更喜欢简单:

    var days = [1, 2, 3, 4, 5];
    if ( 2 in days ) {console.log('weekday');}
    
  • 4
    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 validation/usage

  • 121

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

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

相关问题