【问题标题】:Make a list comma and "and"-separated [closed]制作列表逗号和“和” - 分隔[关闭]
【发布时间】:2013-12-24 16:27:41
【问题描述】:

您的字符串带有分隔符(空格或其他),如下所示:

"1 2 3"
"1 2"
"1"

在 Javascript 中以下列方式格式化它们的最佳/优雅方式是什么?

"1, 2 and 3"
"1 and 2"
"1"

必须适用于任意数量的元素 >= 1

【问题讨论】:

  • 请 A) 改写您的问题,在正文中包含 question,而不是标题,B) 更正拼写错误,以及 C) 提供代码示例你想看。
  • var mystring = "1 2 3"; var splitArr = mystring.split(" "); var finalString = "" for (var i = 0; i
  • 不知道为什么这被否决了。这本身并不难,但它已经是一个反复出现的任务,我希望看到抽象和概括以供重用。
  • +1 确实,很难更好地解释这样的问题。也许你应该展示你的尝试;)

标签: javascript string formatting


【解决方案1】:

一个基本的解决方案:

function format(input, separator) {
    if (!input) return input;
    input = input.split(separator || ' ');
    if (input.length === 1) return input[0];
    return input.slice(0, -1).join(', ') + ' and ' + input.pop();
}

这个坚持你自己的方法(尾随分隔符):

function format(input, separator) {
    var save = input, pattern;
    if (!input) return input;
    pattern = '[^\\' + (separator || ' ') + ']+';
    input = input.match(new RegExp(pattern, 'g'));
    if (!input) return save;
    if (input.length === 1) return input[0];
    return input.slice(0, -1).join(', ') + ' and ' + input.pop();
}

使用示例:

format('1)))2(3)4))', ')'); // "1, 2(3 and 4"

【讨论】:

  • 感谢安德烈亚斯的支持,但请不要再破坏我的帖子!
【解决方案2】:

这个有点扭曲:

function format(input, separator) {
    var idx = input.indexOf(separator || ' ');
    if (idx === -1) return input;
    return input.substring(0, idx++) + (
        input.indexOf(separator || ' ', idx) === -1 ? ' and ' : ', '
    ) + (
        format(input.slice(idx), separator)
    );
}

虽然无法处理连续和尾随分隔符:

format('1|2||3|', '|'); // "1, 2, , 3 and "

【讨论】:

    【解决方案3】:

    如果你也有一个数组,这个也可以。它使用Query $.inArray,如果你不使用jQuery,可以省略,只输入数组形式或字符串形式。

      // Transform a string made of substrings separated by a separator (default "#")
      // or an array in a string that is comma (", ") separated and that has an "and" 
      // separaing the last element. 
      // Ex: 
      //     toCommaAnd("1#2#3")     -> "1, 2 and 3"
      //     toCommaAnd("1 2 3"," ") -> "1, 2 and 3"
      //     toCommaAnd("Mr. Cinelli#Ms. Cinelli") ->"Mr. Cinelli and Ms. Cinelli"
      //     toCommaAnd(["a", "b"])  -> "a and b"
      //
      // !!  toCommaAnd("1#2#3#")    ->   become "1, 2 and 3" TOO so you can 
      //                                  concatenate  elements in loops without 
      //                                  caring about special case for first or
      //                                  last element.  
    
    
      function toCommaAnd(str, separator) {
          var ar = $.isArray(str) ? str : str.split(separator || "#"),  
              commaUntil = ar.length - 1,
              ret = ar[0], 
              i;
    
          //This is just for the 1#2#3# cases.
          if (commaUntil > 0 && ar[commaUntil] === ""){
              commaUntil--;
          }
    
          for (i = 1; i < commaUntil; i++){
              ret += ", " + ar[i];
          }
          if (commaUntil > 0)
              ret += " and " + ar[commaUntil];
    
          return ret ;
      },  
    

    【讨论】:

      【解决方案4】:

      几年前在 StackOverflow 上的某个地方得到了这个。这是一个非常基本的实现——在方法中添加分隔符参数并不难。

          function formatList(myString){
              if ( myString.indexOf(" ") === -1 ) return myString;
      
              if ( myString.indexOf(" ") === myString.lastIndexOf(" ") ){
                  return myString.replace(" ", " and ");
              } 
      
              var former = myString.substr(0, myString.lastIndexOf(" "));
                  former = former.replace(/ /g,", ");
      
              var latter = myString.substr(myString.lastIndexOf(" "), myString.length -1);
              var output = former + " and " + latter;
      
              return output; 
          }
      
      formatList("1"); // 1
      formatList("1 2"); // 1 and 2
      formatList("1 2 3"); // 1, 2 and 3
      formatList("1 2 3 4"); // 1, 2, 3 and 4
      

      【讨论】:

        【解决方案5】:

        你可以用这个:

        <!DOCTYPE html>
        <html>
        <body>
        <script>
        cars=["Elem 1","Elem 2","Elem 3","Elem 4"];
        var s = '';
        var sep = '';
        for (var i=0;i<cars.length;i++)
        {
          if(i==cars.length-1){
            s=s+" and "+cars[i];
          }else{
           s=s+sep+cars[i];
           sep = ', ';
          }
        }
        document.write(s + "<br>");
        </script>
        </body>
        </html>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多