You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript实现英文单词单数化的精准解决方案技术问询

Great question! Singularization is way trickier than pluralization in English—those irregular edge cases always trip up regex-based solutions. Let's walk through your options to get better accuracy, based on your needs.

1. Improved Rule-Based Approach (No Full Dictionary)

Your current function works for simple suffix-based plurals, but it fails because it doesn’t account for three key issues:

  • Irregular internal changes (like analysis → analyses, where the root changes instead of just the suffix)
  • Invariant nouns (words like series that stay the same in singular and plural)
  • Suffix priority (longer, more specific suffixes like -ves need to be checked before -s to avoid mistakes like turning knives into knive)

Here’s a refined version that fixes these gaps:

function singularize(word) {
  // First handle common irregular plural-to-singular pairs
  const irregularPairs = new Map([
    ['analyses', 'analysis'],
    ['phenomena', 'phenomenon'],
    ['criteria', 'criterion'],
    ['media', 'medium'],
    ['data', 'datum'], // Note: "data" is often used as plural in casual speech, but its technical singular is "datum"
    ['children', 'child'],
    ['teeth', 'tooth'],
    ['feet', 'foot']
  ]);
  if (irregularPairs.has(word)) {
    return irregularPairs.get(word);
  }

  // Handle invariant nouns (no change between singular/plural)
  const invariantNouns = new Set([
    'series', 'species', 'deer', 'sheep', 'fish'
  ]);
  if (invariantNouns.has(word)) {
    return word;
  }

  // Suffix rules ordered by specificity (longer/more unique first)
  const suffixRules = [
    [/([^f])ves$/, '$1fe'], // e.g., knives → knife
    [/([^aeiou]y)ies$/, '$1y'], // e.g., babies → baby
    [/([aeiou]y)s$/, '$1y'], // e.g., boys → boy
    [/i$/, 'us'], // e.g., cacti → cactus
    [/zes$/, 'z'], // e.g., buzzes → buzz
    [/ses$/, 's'], // e.g., buses → bus
    [/es$/, ''], // e.g., boxes → box
    [/s$/, ''] // e.g., cats → cat
  ];

  // Test each rule in order and return the first match
  for (const [regex, replacement] of suffixRules) {
    if (regex.test(word)) {
      return word.replace(regex, replacement);
    }
  }

  // Fallback: if no rules apply, return the original word
  return word;
}

This will handle way more cases than your original function, though you’ll still need to add more irregular pairs if you run into edge cases like geese → goose or men → man.

2. Browser Built-In Dictionary Access

Unfortunately, there’s no standard browser API that lets you directly access a built-in dictionary for singular/plural conversion. Browsers do have spell-checking dictionaries, but these are not exposed via JavaScript for lexical tasks like this.

The closest thing is Intl.PluralRules, but that’s for determining when to use a plural form based on a number (e.g., "1 cat" vs "2 cats")—it can’t convert an existing plural word back to its singular form.

3. Lightweight Dictionary-Based Solutions (No Full Dictionary)

If you need better accuracy than rule-based methods but don’t want to embed a huge full dictionary, a curated list of high-frequency irregular pairs is your best bet. You can expand the irregularPairs map from the first section to include more common words.

For even broader coverage, you can use open-source lists of English irregular plurals (many available as small JSON files) and load only the most frequently used entries. This balances accuracy and file size, avoiding the bloat of a complete dictionary.

For example, here’s how you might expand the irregular map to cover more cases:

const expandedIrregularPairs = new Map([
  ['analyses', 'analysis'],
  ['phenomena', 'phenomenon'],
  ['criteria', 'criterion'],
  ['media', 'medium'],
  ['data', 'datum'],
  ['children', 'child'],
  ['teeth', 'tooth'],
  ['feet', 'foot'],
  ['geese', 'goose'],
  ['mice', 'mouse'],
  ['men', 'man'],
  ['women', 'woman'],
  ['oxen', 'ox'],
  ['people', 'person']
]);

内容的提问来源于stack exchange,提问作者Julius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:57:17