浏览器支持 array.includes 和替代品

Posted

技术标签:

【中文标题】浏览器支持 array.includes 和替代品【英文标题】:Browser support for array.includes and alternatives 【发布时间】:2015-08-08 07:19:49 【问题描述】:

我查了一下,发现这是关于在数组中的较大字符串中查找子字符串的。 Array.Prototype.includes

if (t.title.includes(searchString))

我的t$.each 的一部分,该$.each 正在迭代更大的对象数组(每个对象都有大量的信息,来自字符串、日期等)。 searchString 是用户在框中输入的任何内容。所有这些都是对我在页面上的列表的简单搜索功能。

这在 Chrome 中运行良好。但是 Firefox 和 IE 出现错误说明

TypeError: currentTicket.title.includes is not a function

所以我要么设置一个警告标志,表明我的应用只能在 Chrome 上运行,要么我手工制作了一个查找功能?奇怪的是我发布的 MDN 的文档页面指出只有 Firefox 支持array.includes,奇怪的是只有 Chrome 运行它。

【问题讨论】:

所以基本上这个功能在任何浏览器中都不起作用,除了可能最新版本的 Chrome 和 Firefox,您想知道为什么它不起作用?顺便说一句,这个函数应该很容易填充,它就在你发布的链接中。 我投票决定将此问题作为题外话结束,因为解决方案已发布在问题中! 顺便说一句,您使用的不是Array.prototype.includes,而是String.prototype.includes。你也可以使用常见的indexOf 方法来做这种事情。 试过使用Array.prototype.some ? @adeneo 这不是非黑即白。我刚刚为我的问题添加了相关文档,但我不太清楚这意味着什么。我不确定 polyfil 是什么或如何使用它(请参阅我对另一个答案的评论)。至于使用 indexof,我在 Firefox 和 IE 中遇到了同样的错误 【参考方案1】:

考虑使用更广泛支持的方法,例如Array.prototype.indexOf()(IE 也支持),而不是使用当前标记为“实验性”的 API。

您可以使用t.title.indexOf(string) >= 0 而不是t.title.includes(string)

您还可以使用Array.prototype.filter() 获取符合特定条件的新字符串数组,如下例所示。

var arr = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"];
document.getElementById("input").onkeyup = function() 
  document.getElementById("output").innerhtml = arrayContainsString(arr,this.value);

document.getElementById("header").innerHTML = JSON.stringify(arr);

function arrayContainsString(array, string) 
  var newArr = array.filter(function(el) 
    return el.indexOf(string) >= 0;
  );
  return newArr.length > 0;
<input id="input" type="text" />
<br/>
<div>array contains text:<span id="output" />
</div>
<div id="header"></div>

【讨论】:

【参考方案2】:

正如您链接到的 MDN 文章所说,Firefox 仅在夜间构建中支持 .includes,其他浏览器根本不支持它在文章最后更新时(Chrome 可能已经已更新以在以后支持它)。如果要支持所有浏览器,可以使用同一篇文章中概述的 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;
  ;

但是,听起来您的问题有更好的解决方案,但如果没有任何细节就很难说。

【讨论】:

Polyfill 到底是什么,如何在我的 js 中应用它?抱歉,我试过用谷歌搜索这个,但找不到任何相关内容。 The first result from Google 很好地涵盖了这个主题:polyfill 是一段代码,它确保浏览器具有某些可用的功能(如Array.prototype.includes),无论它是否被本机支持。在您想使用该方法之前,您需要将它包含在页面的某个位置,因此很可能尽早。 我尝试复制那段代码,但它什么也没做。它的行为是像正常功能还是... 如果上述方法不能解决您的问题,那么您的目标对象很可能一开始就不是数组。没有更多的代码是不可能的。

以上是关于浏览器支持 array.includes 和替代品的主要内容,如果未能解决你的问题,请参考以下文章

Array.includes 在 html 文件上传和 localforage 中无法正常工作

array.includes的使用

如何为 JS Array.includes() 提供 equals/hash 函数? [复制]

Array.includes 总是错误的 javascript

array.includes 使用正则表达式返回 false

检查数组中是不是存在迭代器时,array.includes 不起作用[重复]