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

orl*_*o21 0 javascript arrays

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

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

Ric*_*ler 6

你有几个误解:

  1. 正则表达式用于匹配匹配特定模式的字符串。这是一个强大的东西,但我想说如果你试图找到一个完全匹配的东西,它不是最好的工具。在这种情况下,您可以只使用严格相等运算符===。(如果您确实想使用正则表达式,则可以在正则表达式之前添加 the^和 the$以匹配该行的第一个和最后一个字符,例如/^Markdown$/只匹配Markdown
  2. Polyfills 实现了 Javascript 标准 (EcmaScript) 缺少的功能,并且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)