JavaScript:使用reduce函数的句子变体

JavaScript:使用reduce函数的句子变体,javascript,algorithm,reduce,Javascript,Algorithm,Reduce,出于搜索目的,给定一个类似BBC Sport的字符串,我想构造一个如下所示的数组: [ 'BBC', 'BB', 'B', 'Sport', 'Spor', 'Spo', 'Sp', 'S' ] 我使用2个for循环来实现它: const s = "BBC sport"; const tags = []; const words = s.split(" "); for (let word of words) { const wl = word.length; for (le

出于搜索目的,给定一个类似BBC Sport的字符串,我想构造一个如下所示的数组:

[ 'BBC', 'BB', 'B', 'Sport', 'Spor', 'Spo', 'Sp', 'S' ]
我使用2个for循环来实现它:

const s     = "BBC sport";
const tags  = [];
const words = s.split(" ");

for (let word of words) {
  const wl = word.length;
  for (let i = 0; i < wl; i++) {
    tags.push(word.substr(0, wl - i));
  }
}

// tags now equals [ 'BBC', 'BB', 'B', 'Sport', 'Spor', 'Spo', 'Sp', 'S' ]
但是,如果可能的话,我想用reduce函数而不是for循环来实现它


您将如何解决它?

老实说,我会像您那样编写代码。两个循环可读、可维护且快速

如果您真的需要一条龙:

  s.split(" ").flatMap(word => Array.from(word, (_, i) => word.slice(0, i + 1)))

老实说,我会像你那样写代码。两个循环可读、可维护且快速

如果您真的需要一条龙:

  s.split(" ").flatMap(word => Array.from(word, (_, i) => word.slice(0, i + 1)))

这是一个依赖于函数生成器的解决方案,我会使用它,还有一个使用reduce的解决方案,我个人不会使用它,它接受一个输入字符串和一个分隔符

在您的例子中,分隔符当然是空白的,但它可以自定义

下面的代码将遍历输入字符串,并对每次出现的字符串的相关部分进行切片,方法是将其大写,因为它看起来像是

这应该足够有弹性,同时,通过最终向toTagList方法添加额外的参数,或者允许进一步的转换(因为它是可移植的),可以很容易地进行自定义

康斯特s=英国广播公司体育; 函数*toTagListinput,分隔符{ //由分隔符分割。 对于input.splitseparator的const块{ //对于每个字符串块,拆分整个单词。 var splitted=block.split; //通过从第一个字符到最后一个字符对输入数组进行切片,然后减少以仅获取所述单词的先前部分。 对于变量i=拆分的长度;i>0;i-{ //最后,生成大写的字符串。 收益率1.0,即连接; } } } //这只是将字符串大写。 函数输入{ 返回input.charAt0.toUpperCase+input.substring1,input.length; }
console.log[…toTagLists',] 这是一个依赖于函数生成器的解决方案,我会使用它,还有一个使用reduce的解决方案,我个人不会使用它,它接受一个输入字符串和一个分隔符

在您的例子中,分隔符当然是空白的,但它可以自定义

下面的代码将遍历输入字符串,并对每次出现的字符串的相关部分进行切片,方法是将其大写,因为它看起来像是

这应该足够有弹性,同时,通过最终向toTagList方法添加额外的参数,或者允许进一步的转换(因为它是可移植的),可以很容易地进行自定义

康斯特s=英国广播公司体育; 函数*toTagListinput,分隔符{ //由分隔符分割。 对于input.splitseparator的const块{ //对于每个字符串块,拆分整个单词。 var splitted=block.split; //通过从第一个字符到最后一个字符对输入数组进行切片,然后减少以仅获取所述单词的先前部分。 对于变量i=拆分的长度;i>0;i-{ //最后,生成大写的字符串。 收益率1.0,即连接; } } } //这只是将字符串大写。 函数输入{ 返回input.charAt0.toUpperCase+input.substring1,input.length; }

console.log[…toTagLists',];为什么需要这个数组来进行搜索?我正在使用MongoDB进行搜索,这是实现部分文本搜索的一个好方法。我不熟悉MongoDB,但是像youStringField.IncludePartialSearchText或regex这样的东西不起作用?太慢了。请看这里,但在数组中搜索字符串将花费更多时间,并且每个字符串字段将占用大量空间。而且它不支持不敏感的搜索。为什么需要这个数组来进行搜索?我使用MongoDB进行搜索,这是实现部分文本搜索的好方法。我不熟悉MongoDB,但类似youStringField.IncludePartialSearchText或regex的东西不起作用?太慢了。请看这里,但在数组中搜索字符串将花费更多时间,并且每个字符串字段将占用大量空间。它不支持不敏感的搜索。哦,这是一个有趣的用法。从,我没有想过使用它来初始化数组大小。确实很聪明。哦,这是一个有趣的用法。从,我没有想过使用它来初始化数组大小。确实很聪明。谢谢,但是你的reduce映射没有返回我想要的输出。然而,这是一个非常好的选择solution@YardenST你想把它资本化还是什么?reduce返回的是正确的元素,不确定您是否希望以不同的方式进行排序或将其大写,您的示例也没有这样做,这就是reduce解决方案与大写问题无关的原因。试着把你的输出和我的比较一下,它是不同的。你的是数组,我的是数组strings@YardenST行动组,我没有注意到,我会立即修复:P@YardenST修正了,很抱歉,我在测试时没有注意到。谢谢,但是你的红色
uce映射未返回所需的输出。然而,这是一个非常好的选择solution@YardenST你想把它资本化还是什么?reduce返回的是正确的元素,不确定您是否希望以不同的方式进行排序或将其大写,您的示例也没有这样做,这就是reduce解决方案与大写问题无关的原因。试着把你的输出和我的比较一下,它是不同的。你的是数组,我的是数组strings@YardenST行动组,我没有注意到,我会立即修复:P@YardenST修正了,很抱歉,我在测试时没有注意到。