浏览器支持 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 中无法正常工作
如何为 JS Array.includes() 提供 equals/hash 函数? [复制]
Array.includes 总是错误的 javascript