将字符串数组中字符串的每个首字母大写

Capitalise every first letter of a string in an array of strings

我基本上采用了一个 URL,比如 http://localhost:3000/north-america/america,然后在第三个斜杠之后将每个条目放入一个数组中。

我有一个像这样的字符串数组 ["america", "north-america"]。

我想将每个条目的每个首字母和每个条目中的每个单词都大写,然后将字符串重新连接在一起得到这个结果 ["America", "North-America"。

我还想从任何条目中删除破折号并用 space 替换它们,从而得到 ["America", "North America".

的最终结果

到目前为止,我已经设法得到这个 ["America", "North america"],但我很难将第二个单词大写。

const urls = "http://localhost:3000/north-america/america"

useEffect(() => {
    if (withAvailabilityChecker === true && urlS !== undefined) {
      const url = urlS;
      let parts: string[] = [];

      parts = url.split('/');
      parts.splice(0, 3);
      parts.reverse();
      parts.splice(0, 1);

      const newParts: string[] = [];

      parts.forEach(el => {
        const removeDashes = el.replaceAll('-', ' ');
        const capitaliseEntry = removeDashes.charAt(0).toUpperCase() + removeDashes.slice(1);
        newParts.push(capitaliseEntry);
      });

      if (newParts.length > 2) {
        newParts.length = 2;
      }
      const result = newParts.join(',' + ' ');

      setInputVal(result);
    }
  }, [urlS, locationName]);

我将字符串拆分为 space,将每个单词大写并重新加入:

const capitaliseEntry = 
    removeDashes.split(' ').map(w => w[0].toUpperCase() + w.slice(1)).join(' ');
  • 首先,在您的代码中
      parts = url.split('/');
      parts.splice(0, 3);
      parts.reverse();
      parts.splice(0, 1);

为什么你有最后一行,也就是 parts.splice(0, 1)?因为据我了解你的问题,你想要第三个斜杠中的所有条目,而最后一行只是删除最后一个元素。所以你给出了 http://localhost:3000/north-america/america 的例子,根据你的代码,它只是 return ["north-america"],而不是 america,因为它被你代码的最后一行删除了。

  • 得到数组后,可以先映射所有项去掉破折号,再大写。就像下面的例子。
const data = parts.map((element: string) => {
    const dashesRemoved = element.replace(/-/g, " ");
    const dashesRemovedWords = dashesRemoved.split(" ");
    const dashesRemovedCapitalized= dashesRemovedWords.map((word: string) => word[0].toUpperCase() + word.slice(1).toLowerCase());

    return dashesRemovedCapitalized.join(" ");
});

现在所有这些变量都是为了清楚地说明正在发生的事情,如果你愿意,你实际上可以组合所有这些函数,就像这样

const data = parts.map((element: string) => element.replace(/-/g, " ").split(" ").map((word: string) => word[0].toUpperCase() + word.slice(1).toLowerCase()).join(" "));
  • 我还看到你在声明这样的部分
      let parts: string[] = [];

      parts = url.split('/');

但是你甚至没有任何中间代码,或者看起来是这样。那么用

初始化你的变量不是更好吗?
const parts: string[] = url.split("/");

使用 URL object to isolate the pathname and split to return individual path strings. Then String#replace() with a regex and callback 同时删除破折号和首字母大写。

const
  titleCase = (s) => s.replace(/\b([-\w])/g, m => m === '-' ? ' ' : m.toUpperCase()),

  url = "http://localhost:3000/north-america/america",

  data = new URL(url) // URL { href: 'http://localhost:3000/north-america/america', origin: 'http://localhost:3000', protocol: 'http:', username: '', password: '', host: 'localhost:3000', hostname: 'localhost', port: '3000', pathname: '/north-america/america', search: '', searchParams: URLSearchParams { }, hash: ''}
    .pathname         // "/north-america/america"
    .slice(1)         // "north-america/america"
    .split('/')       // ["north-america", "america"]
    .map(titleCase)   // ["North America", "America"]
    .reverse();       // ["America", "North America"]

console.log(data.join(', '));

循序渐进是最好的方法。

  • 首先使用/字符作为除数拆分URL。
let parts: string[] = url.split("/")
  • 删除前三个斜线之前的所有内容。
parts = parts.slice(3)
  • 查看 parts 数组中的每个项目以查找任何 - 个字符并将其删除。
  • 将每个项目拆分成单独的词。
  • 将每个单词的第一个字母大写。
  • 将单词重新组合成一个项目。
parts = parts.map(item => {

    // Replacing dashes with spaces
    item = item.replace(/-/g, " ")

    
    item = item.split(" ") // Splitting each part into separate words
               .map(word => word[0].toUpperCase() + word.slice(1)) // Capitalising the first letter of each word
               .join(" ") // Joining back capitalised words

    return item
})
  • 最后反转数组以正确排列零件
parts = parts.reverse()

完整的详细解决方案

let url = "http://localhost:3000/north-america/america"

let parts = url.split("/")

parts = parts.slice(3)

parts = parts.map(item => {
  item = item.replace(/-/g, " ")
  
  item = item
    .split(" ")
    .map(word => word[0].toUpperCase() + word.slice(1))
    .join(" ")

  return item
})


parts = parts.reverse()


console.log(parts) // Outputs: ["America", "North America"]

完整的非详细解决方案

let url = "http://localhost:3000/north-america/america"

let parts = url
  .split("/")
  .slice(3)
  .map(item => {
    return item
      .replace(/-/g, " ")
      .split(" ")
      .map(word => word[0].toUpperCase() + word.slice(1))
      .join(" ")
  }).reverse()


console.log(parts) // Outputs: ["America", "North America"]