确定数组是否包含值

IT技术 javascript arrays contains
2021-02-07 04:52:13

我需要确定一个值是否存在于数组中。

我正在使用以下功能:

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"));
6个回答

jQuery有一个实用功能:

$.inArray(value, array)

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

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

@Steve Paul 名字有什么问题?它按照它说的做:-1=它不存在,其他任何东西=它在那里
2021-03-12 04:52:13
$.inArray's return的非布尔值绝对感觉像是 jQuery 的一个错误。当然,它应该重命名为$.indexOf,如果那是它正在填充的功能?
2021-03-14 04:52:13
很容易建议某人对所有 javascript 使用 JQuery 方法,但由于最初的问题是针对 javascript 解决方案,因此应该以这种方式提供
2021-03-19 04:52:13
不要让“inArray”这个名字欺骗了你。如上所述(但当然我没有仔细阅读),如果元素不存在,则返回 -1 (非 false)
2021-03-29 04:52:13
'inArray' 意味着将返回一个布尔值,指示是否可以在数组中找到该元素。因此,用户可能会想使用以下表达式: if ($.inArray('myval', myarray)) {...} 如果 'myval' 不在 myarray 中,则计算结果为 true。此外,如果 myval 的索引为 0,它将评估为 false。
2021-04-04 04:52:13
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 验证/使用

请注意,数组上的 indexOf 没有在 IE 中实现,但您可以自己定义它
2021-03-24 04:52:13
这个答案指的是哪个版本的 IE?
2021-03-26 04:52:13
修复了比较并添加了缺失的return -1请注意,根据 ES5 规范,在有符号零和 NaN 的情况下,此方法的行为将与本机方法不同(参见 15.4.4.14 和 9.12 与 11.9.6)
2021-03-28 04:52:13
请注意,在 Sharepoint 2010 中,如果您实现 Array.Prototype,WebParts 可能会中断:labs.steveottenad.com/type-mismatch-on-wpadder-js
2021-03-29 04:52:13
您应该使用类型比较===与本机实现兼容
2021-04-08 04:52:13

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

return arrValues.indexOf('Sam') > -1
不适用于 NaN
2021-03-15 04:52:13
return ~arrValues.indexOf('Sam')false如果元素不存在于数组中,则返回
2021-03-27 04:52:13
我喜欢 Kenneth J 的评论如何获得比答案更多的赞成票。但是好东西 - 我已经将 indexOf() 用于字符串,但我不知道您通常可以将它用于数组。
2021-03-29 04:52:13
indexOf 在 <IE9 中不起作用。
2021-04-06 04:52:13
@SebastianMach 如果所有网络开发人员都表示不同意......用户将被迫改变。并帮助公司节省资金,因为他们不必聘请 IE 开发人员
2021-04-08 04:52:13

Array.prototype.includes()

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

includes()方法确定数组是否包含某个元素,返回truefalse视情况而定。

例子

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

支持

根据kangaxMDN,支持以下平台:

  • 铬 47
  • 边缘 14
  • 火狐 43
  • 歌剧 34
  • 野生动物园 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;
  };
}
谢谢!Babel polyfils 很好 :-) 我记得 2 年前 jQuery 在任何项目中,现在它是 Babel :) JavaScript 社区的巨大胜利!许多平台上已经有 ES7 可用的表格,包括 babel pollyfils kangax.github.io/compat-table/es2016plus
2021-03-23 04:52:13
我很想在有关多个变量值或数组的几个 javascript 问题中发布此答案。MDN 的 polyfill 很好。
2021-04-07 04:52:13

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

效率,因为你可以保证在任何给定的时间,像 underscore 这样非常流行的库将有最有效的方法来完成这样的效用函数。

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

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

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

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

辅助库可能看起来很方便,但往往(太)经常更改,请参阅上面的评论“lodash 4 ' .contains()' 现在是 ' .includes()'”
2021-03-16 04:52:13
@threed,您不必包含整个库。require('lodash/collections/contains') 可以包含部分功能。
2021-03-22 04:52:13
在 2.x 之前的 Lodash 版本中 _.include() 是 _.contains() 的别名,并且没有定义 _.includes() 。从 ver. 3.x, _.include() 和 _.contains() 都是 _includes() 的别名。但从 ver. 4.x,只有 _.includes() 而没有其他别名。
2021-03-27 04:52:13
仅供参考:在 lodash 4 中,它现在_.includes()不是_.contains().
2021-04-01 04:52:13
@anneb 可以说任何图书馆。这就是为什么你有 semver 和依赖管理。
2021-04-04 04:52:13