【问题标题】:Browser support for array.includes and alternatives浏览器支持 array.includes 和替代品
【发布时间】: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 中遇到了同样的错误

标签: javascript arrays ecmascript-5 ecmascript-2016


【解决方案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),无论它是否被本机支持。在您想使用该方法之前,您需要将它包含在页面的某个位置,因此很可能尽早。
    • 我尝试复制那段代码,但它什么也没做。它的行为是像正常功能还是...
    • 如果上述方法不能解决您的问题,那么您的目标对象很可能一开始就不是数组。没有更多的代码是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 2010-12-28
    • 2018-03-20
    • 2014-05-18
    相关资源
    最近更新 更多