如何在JavaScript中创建缩写/首字母缩略词?

4

第一次编程 我试图编写一个函数,用于制作单词的缩写/首字母缩略语,例如:'I love you' -> 'ily'。我已经尝试以多种方式重写代码,但是console.log仅显示了第一个给定单词的第一个字母。

function makeAbbr(words) {
  let abbrev = words[0];
  let after = 0;
  let i = 0;
  for (const letter of words) {
    if (letter === '') {
      i = words.indexOf('', after);
      abbrev += words[i + 1];
    }
    after++;
  }
  return abbrev;
}
const words = 'a bc def';
let result = makeAbbr(words);
console.log(result)


3
"我爱你"。.match(/\b(\S)/g).join("") - GottZ
@GottZ 有没有简单的方法?比如更改我的代码中的某些内容?我还不熟悉“match”和“join”。 - Kuba Nowoszyński
2
letter === '' ---> letter === ' ' words.indexOf('', after) ---> words.indexOf(' ', after) - Yousaf
1
words.indexOf(' ', after) 也可以改为 words.indexOf(letter, after),虽然这并不是很重要。它只是减少了硬编码值的数量。 - Reyno
我主要在评论中提供这个匹配,以便您看到解决问题的替代方案。我强烈建议学习RegExp,因为它们是一个非常强大的工具。(还要记住,给定的匹配也适用于:" I love you ") - GottZ
显示剩余3条评论
5个回答

3

这是我对您的函数的实现:

将句子拆分成数组,获取每个单词的第一个字母,并将它们连接成一个字符串。

const makeAbbr = string => string.split(' ').map(word => word[0]).join('');

console.log(makeAbbr('stack overflow'));
console.log(makeAbbr('i love you'));

`


这只是一个示例,用于演示该功能。 - Marc B.
您可能考虑链接到(适合初学者的)资源,介绍“split”、“map”和“join”是什么。也许其他SO问题对此目的是理想的。 - Rashad Saleh

2

不使用数组。但你真的应该学习它们。

  1. 首先去掉前导和尾随的空格。
  2. 将第一个字符添加到缩略词中。
  3. 循环遍历字符串的其余部分,如果前一个字符是空格(并且当前字符不是空格),则将当前字符添加到缩略词中。

function makeAbbr(words) {
  words = words.trim();
  const length = words.length;
  let acronym = words[0];

  for(let i = 1; i < length; i++) {
    if(words[i - 1] === ' ' && words[i] !== ' ') {
       acronym += words[i];
    }
  }

  return acronym;
}
console.log(makeAbbr('I love you'));
console.log(makeAbbr('I     love     you'));
console.log(makeAbbr('   I    love    you   '));

这是专为GottZ设计的版本。

function w(char) {
   char = char.toLocaleLowerCase();
   const coll = Intl.Collator('en');
   const cmpA = coll.compare(char, 'a');
   const cmpZ = coll.compare(char, 'z');

   return cmpA >= 0 && cmpZ <= 0;
}

function makeAbbr(words) {
  words = words.trim();
  const length = words.length;
  if(!length) return '';

  let acronym = words[0];

  for(let i = 1; i < length; i++) {
    if(!w(words[i - 1]) && w(words[i])) {
       acronym += words[i];
    }
  }

  return acronym;
}
console.log(makeAbbr('I love you'));
console.log(makeAbbr('I     love     you'));
console.log(makeAbbr('   I    love    you   '));
console.log(makeAbbr('   \tI ...  ! love \n\r   .you   '));
console.log(makeAbbr('   \tI ...  ! Löve \n\r   .ÿou   '));


嗯,修复它很容易 :) - Roman
1
@GottZ commit -m "修复前导空格" - Roman
1
终于有人欣赏命令行了。那么,制表符或其他空格字符呢? - GottZ
哦,你刚才做得很好,我给你点了个赞。 - GottZ
顺便提一下,其他像 Rust 这样的语言在提供空字符串时会抛出越界异常。幸运的是,JavaScript 在这种情况下只返回 undefined。有很多方法来防止人们滥用这个接口,例如使用 typeof 和检查最小长度。 - GottZ
显示剩余2条评论

1

既然您希望使用自己的方法,那么试试这个(代码有注释)

function makeAbbr(words) {
  let abbrev = "";
  for (let i = 0; i < words.length - 1; i++) { // Loop through every character except the last one
    if (i == 0 && words[i] != " ") { // Add the first character
      abbrev += words[i];
    } else if (words[i] == " " && words[i + 1] != " ") { // If current character is space and next character isn't
      abbrev += words[i + 1];
    }
  }
  return abbrev.toLowerCase();
}
const words = 'a bc def';
let result = makeAbbr(words);
console.log(result)


1

如果您想完全采用您的方法,那么在指定的行上您有一个拼写错误。字符永远不可能是""(一个空字符串),但是字符可以是一个空格" "。修复此拼写错误可以使您的解决方案正常工作。

function makeAbbr(words) {
  let abbrev = words[0];
  let after = 0;
  let i = 0;
  for (const letter of words) {
    if (letter === ' ') { // This line here
      i = words.indexOf(' ', after);
      abbrev += words[i + 1];
    }
    after++;
  }
  return abbrev.toLowerCase(); // Also added .toLowerCase()
}
const words = 'a bc def';
let result = makeAbbr(words);
console.log(result)


0

有几个问题困扰着你。

  1. let abbrev = words[0]; 只是取出了传入函数的单词字符串的第一个字母,并在某些时候添加了一些新内容。

  2. for (const letter of words) {...}: for/of 语句用于迭代数组,而不是字符串。

这是你代码的重新编写版本。它仍然使用了 for/of,但这次我们从字符串中创建了一个单词数组,并对其进行迭代。

function makeAbbr(str) {

  // Initialise `abbrev`
  let abbrev = '';

  // `split` the string into an array of words
  // using a space as the delimiter
  const words = str.split(' ');

  // Now we can use `for/of` to iterate
  // over the array of words
  for (const word of words) {

    // Now concatenate the lowercase first
    // letter of each word to `abbrev`
    abbrev += word[0].toLowerCase();
  }

  return abbrev;

}

console.log(makeAbbr('I love you'));
console.log(makeAbbr('One Two Three Four Five'));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接