【问题标题】:Array Parsing & String Construction in JavascriptJavascript中的数组解析和字符串构造
【发布时间】:2021-09-08 10:09:48
【问题描述】:

我想我已经很接近了,但我希望得到您的反馈,以使用我已经创建的代码的派生来解决这个问题,我通过了以下测试,但我正在努力通过最终测试,因为我需要返回两个中间名缩写,目前我只能返回第一个。下面的测试显示了传递的函数和参数,而预期的结果是我正在努力解决的最后一个问题。我将不胜感激您的专家建议。亲切的问候,乔恩

Test.assertEquals(initializeNames('Jack Ryan'), 'Jack Ryan', '');
Test.assertEquals(initializeNames('Lois Mary Lane'), 'Lois M. Lane', '');
Test.assertEquals(initializeNames('Dimitri'), 'Dimitri', '');
Test.assertEquals(initializeNames('Alice Betty Catherine Davis'), 'Alice B. C. Davis', '')

function initializeNames(name) {

  let seperateNames = name.split(' ');
  let output = "";

  if (name.length = 2) {
    output = name;
  }

  for (let i = 1; i < seperateNames.length - 1; i++) {

    output = seperateNames[i];
    let abvName = output.substring(0, 1) + '.';
    output = seperateNames[0] + ' ' + abvName + ' ' + seperateNames.slice(-1);
  }

  return output;
}

【问题讨论】:

    标签: javascript arrays string


    【解决方案1】:

    这个 if 条件是没用的。因为= 是赋值,== 是相等检查。

    if (name.length = 2) {
        output = name;
      }
    

    另外我相信你想检查seperateNames 数组的长度。如果长度小于等于 2,您已经知道该怎么做。

    但如果不是,那么您需要循环和额外的计算。

    看看下面以

    开头的代码
    1. 名字,和

    2. 添加abvName,然后

    3. 姓氏

    console.log(initializeNames('Jack Ryan'));
    console.log(initializeNames('Lois Mary Lane'));
    console.log(initializeNames('Dimitri'));
    console.log(initializeNames('Alice Betty Catherine Davis'));
    
    function initializeNames(name) {
    
      let seperateNames = name.split(' ');
      let output = "";
      
      if (seperateNames.length <= 2) {
        output = name;
      }
      else{ output = seperateNames[0];
      for (let i = 1; i < seperateNames.length - 1; i++) {
        let currentOutput = seperateNames[i];
        let abvName = currentOutput.substring(0, 1) + '.';
        output = output + ' ' + abvName + ' ';
      }
      output += seperateNames[seperateNames.length - 1];
      }
      return output;
    }

    注意:x += b;x = x + b; 相同

    【讨论】:

      【解决方案2】:

      传递任意数量的参数。将始终缩写除第一个和最后一个单词以外的所有单词。

      console.log(initializeNames('Jack Ryan'));
      console.log(initializeNames('Lois Mary Lane'));
      console.log(initializeNames('Dimitri'));
      console.log(initializeNames('Alice Betty Catherine Davis'));
      console.log(initializeNames('Alice Betty Ketty Catherine Davis'));
      console.log(initializeNames('Alice Ketty Betty Metty Catherine Davis'));
      console.log(initializeNames('Alice Ketty David Mical Catherine Davis, Louis'));
      
      function initializeNames(name) {
      
        let seperateNames = name.split(' ');
        let output = name;
      
        if(seperateNames.length>2){
            const firstName = seperateNames[0];
            let middleName = "";
            for(let i=1; i<=seperateNames.length-2; i++){
                middleName += " "+seperateNames[i][0]+".";
            }
            const lastName = seperateNames[seperateNames.length-1];
            output = firstName + middleName +" "+ lastName;
        }
      
        return output;
      }

      【讨论】:

      • 谢谢我喜欢这个解决方案,因为我可以轻松地按照逻辑进行操作。尽管我感谢大家不同的解决方案和时间帮助我编写此代码。我喜欢 Stack Overflow,它是一个由志同道合的程序员和人组成的伟大社区。我希望提高我的编码技能,以便将来可以帮助其他人。祝你有美好的一天:0)
      【解决方案3】:
      function initializeNames(name) {
        const [first, ...rest] = name.split(' ');
        return !rest 
          ? first
          : rest.length === 1 
          ? name 
          : rest.length === 2
          ? `${first} ${rest[0][0]}. ${rest[1]}`
          : `${first} ${rest[0][0]}. ${rest[1][0]}. ${rest[2]}`;
      }
      

      rest 的任何其他情况?

      【讨论】:

        【解决方案4】:

        拆分字符串,使用数组spread和rest得到第一个单词,其余单词,使用slice得到中间和最后一个单词。将它们全部组合成一个数组,将中间的单词映射到所需的形式,然后展平并用空格连接:

        const initializeNames = str => {
          const [first, ...rest] = str.split(' ')
          const middle = rest.slice(0, -1)
          const last = rest.slice(-1)
          
          return [
            first, 
            middle.map(([c]) => `${c.toUpperCase()}.`), 
            last
          ].flat().join(' ')
        }
        
        const assertEquals = (a, b) => console.log(`"${a}" & "${b}" are ${a === b ? 'equal' : 'not equal'}`) 
        
        assertEquals(initializeNames('Jack Ryan'), 'Jack Ryan');
        assertEquals(initializeNames('Lois Mary Lane'), 'Lois M. Lane');
        assertEquals(initializeNames('Dimitri'), 'Dimitri', '');
        assertEquals(initializeNames('Alice Betty Catherine Davis'), 'Alice B. C. Davis')

        【讨论】:

          【解决方案5】:

          这是一个函数,它执行给定名称的初始化,并检查拆分名称后得到的数组的长度,并根据结果根据它们的索引执行数组值的更新。

          let names = ['Jack Ryan',
              'Lois Mary Lane',
              'Dimitri',
              'Alice Betty Catherine Davis',
              'John Alexander Davis Smith Doe'
          ];
          
          function initializeNames(name) {
            let words_lists = name.split(' ');
            return words_lists.length === 1? name: words_lists.reduce((accumulator, current, index) => {
              if(index === 0 || index === words_lists.length -1) {
                return accumulator.concat(current);
              } else {
                return accumulator.concat(`${current.charAt(0)}.`);
              }
            }, []).join(' ');
          }
          
          names.forEach(name => console.log(initializeNames(name)));

          根据名称的长度提供它执行更新,因为只有名称的第一部分和最后一部分保持不变。

          【讨论】:

            【解决方案6】:

            也许我没有完全理解你的问题,但是如果你唯一关心的是获取中间词的首字母,你可以这样做:

            function initNames(str){
               return str.trim()
                  .replace(
                    /\s(?=\b)(\w+)(?=\b\s)/gi,
                    (m,g)=> " " + g.slice(0,1) + "."
                  )
            }
            
            console.log(initNames('       Alice Betty Catherine Davis   '));
            console.log(initNames('       Alice Betty Davis   '));
            console.log(initNames('       Alice Davis   '));

            【讨论】:

              猜你喜欢
              • 2020-06-21
              • 1970-01-01
              • 1970-01-01
              • 2013-04-27
              • 2010-10-30
              • 1970-01-01
              • 2021-05-08
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多