我正在使用过滤器函数在名为 arrayList
的数组中查找 JSON 对象,其中包含例如:
[
{
"name": "Markdown",
"extension": "(.md)"
},
{
"name": "MultiMarkdown",
"extension": "(.mmd, .txt)"
}
]
我正在使用以下代码在 name
字段上搜索并找到具有特定名称的对象的匹配项:
findFormat = (name) => {
let format = arrayList.filter(function (el) {
let pattern = new RegExp(name);
return el.name.match(pattern);
});
return format.name
}
因此,如果我正在搜索名称为“Markdown”的对象,则此字符串将通过上面函数中的 name
参数传递,并且 RegExp
表达式解析为 /Markdown/
。
对于过滤器函数本身,我已经实现了 MDN 文档 底部描述的 polyfill:
if (!Array.prototype.filter)
Array.prototype.filter = function(func, thisArg) {
'use strict';
if ( ! ((typeof func === 'Function') && this) )
throw new TypeError();
var len = this.length >>> 0,
res = new Array(len), // preallocate array
c = 0, i = -1;
if (thisArg === undefined)
while (++i !== len)
// checks to see if the key was set
if (i in this)
if (func(t[i], i, t))
res[c++] = t[i];
else
while (++i !== len)
// checks to see if the key was set
if (i in this)
if (func.call(thisArg, t[i], i, t))
res[c++] = t[i];
res.length = c; // shrink down array to proper size
return res;
};
对于正则表达式,我没有使用任何特殊标志,例如 i
因为我想找到“Markdown”的精确匹配项。但是它一直返回 MultiMarkdown
。我原以为上面的过滤函数只找到完全匹配,而不是子字符串。
问题:有没有一种方法可以使用 filter
和 match
方法过滤完全匹配项?上面的 polyfill 不会返回完全匹配吗?
原文由 orlando21 发布,翻译遵循 CC BY-SA 4.0 许可协议
你有几个误解:
===
。 (如果您确实想使用正则表达式,则可以在正则表达式之前添加^
和$
以匹配该行的第一个和最后一个字符,例如/^Markdown$/
只会匹配Markdown
)Array.prototype.filter
在所有主流浏览器中实现,你不需要实现它。请参阅下面的示例,了解如何严格匹配
name
。