在JavaScript中生成随机的人类可读的Slugs

236 阅读4分钟

通常,我们会在网络开发领域看到随机的、人类可读的鼻涕虫(例如:brave-purple-penguin )。这些蛞蝓提供了数字ID的唯一性,但可以更加有趣和好玩。

如何生成随机蛞蝓

生成随机Slugs的关键是。

  • 识别每个Slugs位置中的语篇
  • 为每个语篇准备一个词语清单
  • 当你迭代这些位置时,从该列表中随机选择。

例如,这些Slugs的一个常见模式是adjective-adjective-noun 。因此,你可能有一个形容词的列表,一个名词的列表,以及一个你的词序列表。

const adjective = ['blue', 'smiley', 'funny', 'smelly'];
const noun = ['brick', 'kangeroo', 'penguin', 'laptop'];
const words = { adjective, noun };
const order = ['adjective', 'adjective', 'noun'];

然后,你可以在你的顺序上map ,从相应的单词列表中随机抓取一个元素。

const selected = order.map((partOfSpeech) => {
  const choices = words[partOfSpeech];
  return choices[Math.floor(Math.random() * choices.length)];
});
console.log(selected);
// ['funny', 'blue', 'laptop']

最后,你要用一个- 字符来连接这个数组,这样它就有了kebob-cased。

const slug = selected.join('-');
console.log(slug);
// 'funny-blue-laptop'

使用一个包(我写的!)。

当然,这是一个痛苦的过程,因为你必须自己想出这些词,而且它的可配置性不强。而且,你很快就会用完所有的组合。

为了帮助解决这个问题,我做了一个npm 包!它被称为random-word-slugs ,它有超过1500万个蛞蝓组合(而且还在不断增加)!此外,还有一堆配置。此外,还有一堆配置选项,例如能够指定你想要的单词类别。

继续阅读,看看它是如何工作的!

安装

用npm安装

npm i random-word-slugs

用yarn安装

yarn add random-word-slugs

使用方法

random-word-slugs 包可以在没有任何参数的情况下使用,并默认为一个三个字的,以kebab命名的lug。目前,默认配置有15,660,175个独特的slug组合

import { generateSlug } from 'random-word-slugs';

const slug = generateSlug();
console.log(slug);
// "elegant-green-coat"

generateSlug 函数最多需要两个参数。第一个参数是lug中的numberOfWords (默认为三个),第二个参数是包options 。下面的例子使用了这两个参数,并提供了一个输出标题大小写的选项。

const slug = generateSlug(4, { format: 'title' });
console.log(slug);
// "Elegant Happy Green Coat"

可用选项

options 对象可以有以下键/值对的任何部分集合。

{
  format: "kebab" | "camel" | "sentence" | "lower" | "title",
  partsOfSpeech: ("adjective" | "noun")[],
  categories: {
    adjective: ("colors" | "appearance" | etc...)[],
    noun: ("person" | "animals" | etc...)[]
  }
}

注意,如果提供的话,partsOfSpeech 必须是一个数组,其长度与你所请求的字数相同。如果使用Typescript,编译器将为你检查这一点。

一个完成的options 对象的例子可能是这样的,对于一个三个字的蛞蝓。

const options = {
  format: 'camel',
  partsOfSpeech: ['adjective', 'noun', 'adjective'],
  categories: {
    adjective: ['colors', 'appearance'],
    noun: ['animals'],
  },
};

基于这些选项,我们的输出可能是这样的:blueBearTall

选项的类型描述支持

该包暴露了一个RandomWordOptions<N> 类型,其中N 是lug中的单词数。如果你想用这个类型来指定一个选项对象,它可能看起来像这样(尽管一个Partial 选项对象是肯定允许的,而且可能更常见)。

import { RandomWordOptions } from 'random-word-slugs';

const options: RandomWordOptions<3> = {
  format: 'title',
  categories: {
    noun: ['animals', 'places'],
    adjective: ['colors', 'emotions'],
  },
  partsOfSpeech: ['adjective', 'noun', 'adjective'],
};

重要的是,这里的通用3 将强制要求partsOfSpeech 是一个三元素的元组。

类别

categories 选项允许你从一个类别的子集中生成你的随机蛞蝓。也许你只想要彩色的动物。你可以为组成你的随机弹头的形容词和名词指定一个或多个类别。下面是目前资源库中的类别列表。

形容词类别。

  • 时间
  • 外观
  • 颜色
  • 条件
  • 个性
  • 形状
  • 尺寸
  • 声音
  • 味道
  • 触摸
  • 数量

名词分类。

  • 家庭
  • 教育
  • 宗教
  • 商业
  • 动物
  • 交通运输
  • 事物
  • 技术
  • 地点

评估组合学

在使用该包时,你可能会好奇有多少种不同的弹头组合存在。该包暴露了一个函数来帮助解决这个问题,叫做totalUniqueSlugs 。这个函数可以在没有参数的情况下使用,并将假设一个三弹头的adjective-adjective-noun 格式。

import { totalUniqueSlugs } from 'random-word-slugs';

const totalSlugs = totalUniqueSlugs();
console.log(totalSlugs);
// 100000

**注意:**这里显示的100000 数字只是一个例子,并不代表包中任何时候的蛞蝓总数(随着单词的增加,这个数字会不断变化)。

如果你有不同数量的词、词的排序或类别的子集,你也可以评估组合空间。在下面的例子中,我们将假设一个四个字的鼻涕虫,顺序为adjective-noun-adjective-noun ,只有颜色的形容词和动物的名词。

import { totalUniqueSlugs } from 'random-word-slugs';

const totalSlugs = totalUniqueSlugs(4, {
  partsOfSpeech: ['adjective', 'noun', 'adjective', 'noun'],
  categories: {
    adjective: ['colors'],
    noun: ['animals'],
  },
});
console.log(totalSlugs);
// 1000

同样,这个1000 ,只是一个例子。重要的是,这可以帮助你确定你对这个有限的组合空间不满意,你可以选择增加其他类别。