javascript - 使用数组上的过滤器和匹配方法来查找完全匹配

时间:2017-11-05 19:42:03

标签: javascript arrays

我正在使用过滤器函数在名为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。我原以为上面的过滤函数只找到了完全匹配,而不是子串。

问题:有没有办法可以使用MultiMarkdownfilter方法过滤完全匹配?上面的polyfill不会返回完全匹配吗?

3 个答案:

答案 0 :(得分:3)

你有一些误解:

  1. 正则表达式用于匹配与特定模式匹配的字符串。这是一个强大的功能,但我认为如果你试图找到完全匹配的话,它不是最好的工具。在这种情况下,您可以使用严格相等运算符===。 (如果您确实想使用正则表达式,可以在正则表达式之前添加^$以匹配该行的第一个和最后一个字符,例如/^Markdown$/只匹配{{1 }})
  2. Polyfills实现了Javascript标准(EcmaScript)的缺失功能,Markdown在所有主流浏览器中实现,您不需要实现它。
  3. 请参阅下面的示例,了解如何严格匹配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();
  });