重复第一个字母时格式化名称的大小写

时间:2019-03-04 13:07:46

标签: javascript arrays string replace

我有一个函数,该函数接受一个名称数组,并返回一个新数组,每个名称的首字母转换为大写(其余字母转换为小写)。

function capMe(arr) {
  let newArr = [];
  arr.forEach(function(name) {
    name = name.replace(name[0], name[0].toUpperCase());
    for(let i = 1; i < name.length; i++) {
        name = name.replace(name[i], name[i].toLowerCase());
    }
    newArr.push(name);
});
return newArr;
}

这在大部分时间都有效。例如,如果我这样调用函数:

console.log(capMe(['jACKSON', 'pAM', 'wiLliAm']));

我将收到> Array ["Jackson", "Pam", "William"]的期望输出。

但是,在某些情况下此功能不起作用。如果我使用重复第一个字母的名称来调用该函数,则除第二个字母外,每个字母都将小写。

例如,如果我在上一个示例中添加gEORGANN,我将收到以下输出:

> Array ["georGann", "Jackson", "Pam", "William"]

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

您当前的逻辑没有按照您的想象做。考虑以下出现在每个名称循环中的以下行:

name = name.replace(name[i], name[i].toLowerCase());

这仅用小写字母替换等于name[i] first 字符。这就是使用输入gEORGANN引发逻辑混乱的方式。首先,您将第一个g大写,以获得GEORGANN。然后,当循环到达第四个位置(即大写字母G)时,它将用小写字母G替换 first g。这给我们留下了gEORGANN,但这不是您想要的。原因是replace刚好碰到第一次出现。

可能可以通过全部替换而不是替换来解决此问题。但是,为什么不将大写的第一个字符与小写的字符串其余部分连接起来呢?

arr = ['georGann', 'jACKSON', 'pAM', 'wiLliAm'];
newArr = [];
arr.forEach(function(name) {
    newName = name.charAt(0).toUpperCase() + name.substring(1).toLowerCase()
    newArr.push(newName);
});
console.log(arr);
console.log(newArr);

答案 1 :(得分:0)

您在这里:

const capMe = (arr = []) => {
  return arr.map((name) => {
    const [first, ...rest] = name;
    return `${first.toUpperCase()}${rest.join('').toLowerCase()}`;
  });
}

console.log(capMe(['foo', 'foZBaz']));

答案 2 :(得分:-1)

您的编码逻辑很好。问题是操作顺序。请参见下面;

function capMe(arr) {
    let newArr = [];
    arr.forEach(function(name) {
      name = name.toLowerCase();
      name = name.replace(name[0], name[0].toUpperCase());
      newArr.push(name);
    });
   return newArr;
}
console.log(capMe(['gEORGANN', 'pAM', 'wiLliAm', 'AA']));