【问题标题】:Using filter() to test an array against another array of unknown size使用 filter() 针对另一个未知大小的数组测试一个数组
【发布时间】:2021-07-09 14:06:45
【问题描述】:

我正在搞乱the MDN page detailing Array.prototype.filter() 上的示例代码,我发现一些有趣的事情正在发生。

我将示例代码修改如下:

const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const result = words.filter(word => word.includes('e', 'i'));

console.log(result);
// expected output: const result = words.filter(word => word.includes('e', 'i'));

console.log(结果); // 预期输出:Array ["elite", "exuberant", "destruction", "present"]

它可以工作,但是当我修改它时,这两个字符位于一个变量中(使用constvar 声明)...

const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
var test = ['e', 'i'];
const result = words.filter(word => word.includes(test));

console.log(result);
// expected output: Array ["elite", "exuberant", "destruction", "present"]
// ACTUAL OUTPUT: Array []

最后,如果我将 test 更改为 test[0,1],我会得到第一个结果 - 正如预期的那样。

其他类似的问题似乎对我没有帮助,而且我不太确定这里发生了什么,或者我如何才能完成这项工作。

【问题讨论】:

  • includes('e', 'i') 与 includes(['e', 'i']) 不同
  • 将 .inculdes(test) 替换为 .includes(...test)。
  • 真正的问题是你这里从来不匹配i,所以没有变量的版本也是不正确的。

标签: javascript arrays filter


【解决方案1】:

问题是有变量的版本和没有变量的版本不一样。

word.includes('e', 'i')word.includes(['e', 'i']) 不同(尽管两者都不是你想的那样,如下所述)。

如果您想将参数存储在一个数组中,并将它们作为多个参数(展开)应用到您的函数调用中,而不是作为单个数组参数,您可以使用the spread syntax

const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
var test = ['e', 'i'];
const result = words.filter(word => word.includes(...test));

console.log(result);

真正的问题

这里真正的问题是您没有正确调用该函数。检查the MDN Docs for String#includes

includes(searchString)

搜索字符串 要在 str 中搜索的字符串。

这个函数只接受一个参数。因此,当您word.includes('e', 'i') 时,您不应该期望它与其中包含“i”的单词匹配。只有“e”。

如果要匹配包含要匹配的所有字符串的单词,则需要重做逻辑:

const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];
const test = ['e', 'i'];

const containsAll = words.filter( word => test.every (str => word.includes(str)))
const oneOf = words.filter( word => test.some (str => word.includes(str)))

console.log(containsAll);
console.log(oneOf);

【讨论】:

  • 是的,我刚刚用上面的评论测试了...,但是我发现了一个新问题。使用简单的字符,它似乎可以正常工作,但是,如果我将其更改为var test = ['elite', 'limit'];,我得到["elite"] as the result. If I swap the order, so limit`是第一个,结果是["limit"]。如果我将字母分成单独的字符,它有时会起作用。如果我输入var test = ['s', 'eli'],它似乎会忽略“eli”,只返回与“s”匹配的任何内容......
  • @Anthony 实际上,这是完全不同的问题,有其自身的问题。第一个问题是关于匹配包含单个字符的单词。您的后续问题第二个问题开始做一些非常不同的事情。但是,主要问题是您没有按预期使用该功能。该函数只需要一个参数来匹配,而不是多个。它有一个可选的第二个参数,但这只是针对起始位置。我会更新答案。
  • 那里。查看完整解决方案
  • 嗯,这可能比使用正则表达式更有效。关于这一点,我在 15 年前(学习时)阅读了 Friedl 的“掌握正则表达式”,这让我对各种正则表达式方言感到非常熟悉。仅仅阅读前几章就非常好的时间和金钱投资!但我很困惑;我的最后一个代码没有解决您的问题吗?它将适用于所有类型的字符串,匹配包含所有字符串或任何字符串的所有单词集(我提供了两个版本)。
  • 我在评论时并没有看到这一点,所以要么是编辑,要么我真的很聪明/s(从没说过我很聪明!)但是说真的,谢谢!跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多