【问题标题】:the usage of 'map' method modifying inside contents, javascript使用'map'方法修改内部内容,javascript
【发布时间】:2020-03-31 02:16:52
【问题描述】:

https://www.freecodecamp.org/learn/javascript-algorithms-and-data-structures/basic-algorithm-scripting/title-case-a-sentence

嗨,

我正在练习 Freecodecamp.com 的基本算法。

说明如下。

返回提供的字符串以及每个单词的首字母 大写。确保单词的其余部分为小写。

出于本练习的目的,您还应该大写 连接诸如“the”和“of”之类的词。

这是我的代码。

    const titleCase = str => {
      let result = str.split(' ');
      result = result.map(t => {
        t = t.toLowerCase();
        t[0] = t[0].toUpperCase();
        return t;
      });
      return result.join(' ');
    };
    
    console.log(titleCase("I'm a little tea pot"));

结果 i'm a little tea pot

这就是我的想法。

  1. 按空格将整个字符串提取成片段。
  2. 将其设为小写。
  3. 只将第一个字母大写。
  4. 返回结果。

但是,问题在于 line:5 不影响结果。第一个字母不变。 我错过了什么,对吧?似乎我误解了有关地图方法的一些概念。 你能给出一些建议来解决这个问题吗?

提前致谢。

【问题讨论】:

标签: javascript algorithm


【解决方案1】:

MDN String documentation 中记录了您的代码无法正常工作的原因。

当使用括号表示法进行字符访问时,尝试删除这些属性或为这些属性赋值将不会成功。涉及的属性既不可写也不可配置。

另一种方法是将转换为大写后的第一个字符与剩余的字符串(不包括第一个字符)连接起来。

const titleCase = str => {
  return str.toLowerCase()
    .split(' ')
    .map(w => `${w[0].toUpperCase()}${w.substring(1)}`)
    .join(' ');
};

console.log(titleCase("I'm a little tea pot"));

【讨论】:

    【解决方案2】:

    看起来对字符串的赋值不像在 Javascript 中那样工作,太糟糕了,直觉上是正确的。

    所以,使用一个不存在的字符串拼接,所以用str.split('')将字符串分割成一个字符数组,并使用数组拼接。

    拼接会就地修改输入数组,因此无需重新分配。

    const str = "hello";
    var rayy = str.split(''); // ['h', 'e', 'l', 'l', 'o']
    rayy.splice(0, 1, rayy[0].toUpperCase()); // returns ['h], but rayy is now modified in place to ['H', 'e', 'l', 'l', 'o']
    const str2 = rayy.join('');  // "Hello"
    

    你对map的使用是熟练和恰当的。

    【讨论】:

      【解决方案3】:

      方法链看起来非常优雅 - split+map+join
      和字符串模式 `${var1}${var2}` - 在左后引号 " ` "
      var1 - item[ 0].toUpperCase() - 第一个符号 toUpperCase
      var2 - item.substring(1) - 杀死第一个符号
      .toLowerCase() - 其他符号 toLowerCase

      const titleCase = (str) => str.split(' ')
        .map(item => (`${item[0].toUpperCase()}${item.substring(1).toLowerCase()}`))
        .join(' ')
      
      console.log(titleCase("I'm a litTLE tea pot"));

      【讨论】:

        猜你喜欢
        • 2011-08-23
        • 2021-06-22
        • 2016-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多