在Javascript中更改数组中的字符串字符

4
我正在解决一些CoderByte的问题。这个函数的目标是将一个字符串的每个单词首字母大写。例如,'hello world' 转为 'Hello World'。我无法理解为什么这段代码返回了 'hello world' 而不是 'Hello World'。我知道这行代码 array[i][0] = array[i][0].toUpperCase(); 有问题,但不明白为什么它不起作用。我想出了另一种解决方案,但我想知道为什么这个方法行不通。非常感谢你的帮助!
function LetterCapitalize(str) { 
    var array = str.split(' ');
    for (var i = 0; i < array.length; i++) {
        array[i][0] = array[i][0].toUpperCase();
    }
return array.join('');
} 

LetterCapitalize('hello world');

1
有点重复的问题请参考 https://dev59.com/YG445IYBdhLWcg3wZJiw - Winter Faulk
var upperCased = str.split(" ").map(function(item) {return item.charAt(0).toUpperCase() + item.substr(1)}).join(" ") - JazzCat
1
可能是重复的问题,参考如何在JavaScript中将字符串的第一个字母大写? - Sreekanth
6个回答

2
问题在于array[i]指的是一个字符串。然而,在JavaScript中字符串是不可变的,所以这个操作失败了:array[i][0] = array[i][0].toUpperCase()。你不能在一个字符串上设置单独的索引。
为了实现你想要的功能,你必须创建一个首字母大写的新字符串。以下是一种方法,借鉴自另一个SO帖子:
function capitalizeFirstLetter(str) {
    return str.charAt(0).toUpperCase() + str.slice(1);
}

function capitalizeAllWords(str) { 
    var words = str.split(' ');
    return words.map(capitalizeFirstLetter).join(' ');
} 

capitalizeAllWords('hello world');

啊,好的,我没有意识到。非常感谢您的帮助。 - davysamp

1
您可以在这种情况下使用正则表达式:

function LetterCapitalize(str) { 
  var regex = /(\b[a-z](?!\s))/g;
  str = str.replace(regex, function(x) {
      return x.toUpperCase();
  });

  console.log(str);
} 

LetterCapitalize('hello world');


1
使用.map()函数是处理这个问题的有效方法。
function cap(string){
    return string.split(" ").map(function(word){
        return word.charAt(0).toUpperCase() + word.slice(1)
    }
}

以下是相关代码的逐步指南:

.split(" ") 通过在每个空格处添加新项来创建数组

.map() 获取一个值,将其插入到函数中,并根据函数返回的结果修改该值。

.charAt(0) 获取第一个字母并将其大写

.slice(1) 获取第一个字母之后的每个字母。

谢谢, TheGenieOfTruth

(在移动设备上完成,因此格式不规则,代码未经测试)


0

你没有创建一个二维数组。不能使用 [0] 引用 -- 必须使用子字符串。

注意 substr 和 substring 之间的区别(其中第二个参数是长度 -- 我们只想要一个字符),以及 substring(其中第二个参数是结束位置 - 在此省略,因此到字符串结尾)。

function LetterCapitalize(str) { 
    var array = str.split(' ');
    for (var i = 0; i < array.length; i++) {
        var firstChar = array[i].substr(0,1).toUpperCase();
        if array[i].length == 1
            array[i]=firstChar;
        else
            array[i]=firstChar + array[i].substring(1);
     }
    return array.join(' ');
} 

LetterCapitalize('hello world');

正确。但最好提供一个例子,因为“必须使用子字符串”是一个广泛的陈述,可能会让OP不理解。 - Josh Beam

0

尝试一下函数式编程:

var capitalize = function(str) {
  return str.split(/\s+/)
   .map(function(word) { 
      return word.charAt(0).toUpperCase() + word.slice(1);
    })
  .join(' ');
};

作为额外的奖励,此函数还将换行符(\n)和制表符(\t)字符视为大写字母边界。

-1

试试这个:

function LetterCapitalize(str) { 
        var array = str.split(' ');
        for (var i = 0; i < array.length; i++) {

            array[i] = array[i][0].toUpperCase()+array[i].slice(1);

        }
    return array.join(' ');
    } 

LetterCapitalize('hello world');

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