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

Tha*_*nor 20 javascript arrays ecmascript-5 ecmascript-7

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

if (t.title.includes(searchString))
Run Code Online (Sandbox Code Playgroud)

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

这在Chrome中运行得很好.但Firefox和IE正在出现错误

TypeError: currentTicket.title.includes is not a function
Run Code Online (Sandbox Code Playgroud)

所以我要么提出一个警告标志,我的应用程序只适用于Chrome或我手工查找功能?奇怪的是来自MDN的doc页面我发布了只有Firefox支持的状态array.includes,奇怪的是它只运行它的Chrome.

Thr*_*gle 40

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

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

您还可以使用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;
}
Run Code Online (Sandbox Code Playgroud)
<input id="input" type="text" />
<br/>
<div>array contains text:<span id="output" />
</div>
<div id="header"></div>
Run Code Online (Sandbox Code Playgroud)

  • 这应该标记为答案. (3认同)

Nit*_*Nit 5

正如您链接的 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;
  };
}
Run Code Online (Sandbox Code Playgroud)

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

  • [来自 Google 的第一个结果](https://remysharp.com/2010/10/08/what-is-a-polyfill) 很好地涵盖了这个主题:polyfill 是一段确保浏览器具有某些功能的代码可用(如`Array.prototype.includes`),无论它是否被原生支持。在使用该方法之前,您需要将其包含在页面上的某个位置,因此很可能尽早。 (3认同)