我正在使用过滤器函数在名为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
表达式将解析为{{1 }}
对于过滤器功能本身,我实现了MDN documentation底部描述的polyfill:
/Markdown/
对于正则表达式,我没有使用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;
};
之类的任何特殊标志,因为我想找到“Markdown”的完全匹配。但是它会继续返回i
。我原以为上面的过滤函数只找到了完全匹配,而不是子串。
问题:有没有办法可以使用MultiMarkdown
和filter
方法过滤完全匹配?上面的polyfill不会返回完全匹配吗?
答案 0 :(得分:3)
你有一些误解:
===
。 (如果您确实想使用正则表达式,可以在正则表达式之前添加^
和$
以匹配该行的第一个和最后一个字符,例如/^Markdown$/
只匹配{{1 }})Markdown
在所有主流浏览器中实现,您不需要实现它。请参阅下面的示例,了解如何严格匹配Array.prototype.filter
。
name
答案 1 :(得分:1)
这里不需要RegEx,可能不应该使用它,因为它会慢一些。但是,这不是问题。问题是new RegExp(name);
将创建一个包含搜索的RegEx。请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions。
我建议改变
let pattern = new RegExp(name);
return el.name.match(pattern);
到
return el.name === name;
答案 2 :(得分:0)
如果您想要完全匹配,请检查是否相同
let format = arrayList.filter(function (el) {
return el.name === name;
});
或者,如果您想要不区分大小写,请将案例规范化:
let format = arrayList.filter(function (el) {
return el.name.toLowerCase() === name.toLowerCase();
});