javascript - 在数组上使用 filter 和 match 方法来查找精确匹配

新手上路,请多包涵

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

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

原文由 orlando21 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

你有几个误解:

  1. 正则表达式用于匹配与特定模式匹配的字符串。这是一个强大的东西,但我想说如果你想找到一个精确匹配,它不是最好的工具。在这种情况下,您可以只使用严格相等运算符 === 。 (如果您确实想使用正则表达式,则可以在正则表达式之前添加 ^$ 以匹配该行的第一个和最后一个字符,例如 /^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);

原文由 Rico Kahler 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题