我正在使用过滤器函数在名为 的数组中查找 JSON 对象arrayList,其中包含例如:
[
{
"name": "Markdown",
"extension": "(.md)"
},
{
"name": "MultiMarkdown",
"extension": "(.mmd, .txt)"
}
]
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码在name字段上搜索并找到具有特定名称的对象的匹配项:
findFormat = (name) => {
let format = arrayList.filter(function (el) {
let pattern = new RegExp(name);
return el.name.match(pattern);
});
return format.name
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我正在搜索名称为“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;
};
Run Code Online (Sandbox Code Playgroud)
对于正则表达式,我没有使用任何特殊标志,i因为我想找到“Markdown”的完全匹配项。然而,它一直在返回MultiMarkdown。我原以为上面的过滤器函数只能找到完全匹配,而不是子字符串。
问题:有没有一种方法可以使用filter和match方法仅过滤完全匹配?上面的 polyfill 不会返回完全匹配吗?
你有几个误解:
===。(如果您确实想使用正则表达式,则可以在正则表达式之前添加 the^和 the$以匹配该行的第一个和最后一个字符,例如/^Markdown$/只匹配Markdown)Array.prototype.filter在所有主要浏览器中都实现了,你不需要实现它。有关如何name严格匹配,请参见下面的示例。
const array = [{
"name": "Markdown",
"extension": "(.md)"
},
{
"name": "MultiMarkdown",
"extension": "(.mmd, .txt)"
}
]
const criteria = 'Markdown';
const result = array.filter(item => item.name === criteria);
console.log('result', result);Run Code Online (Sandbox Code Playgroud)