javascript - 如何在 JavaScript 中制作缩写/首字母缩略词?

编码新手我正在尝试制作一个使单词“缩写/首字母缩略词”的功能,例如'我爱你' -> '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)

回答1

不使用数组。但你真的应该了解它们。

  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   '));

回答2

由于您想要使用您的方法的东西,试试这个(代码已注释)

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)

回答3

这是我对您的功能的实现:将句子拆分为一个数组,获取每个单词的第一个字母并将它们连接成一个字符串。

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

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

`

回答4

如果你想准确地使用你的方法,你在指定的行上有一个错字。字符永远不能是 ""(空字符串),但字符可以是空格 " "。修正此错字可使您的解决方案发挥作用。

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)

回答5

有几件事让你绊倒。

  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'));

相似文章