Javascript数组到语句

Javascript数组到语句,javascript,jquery,Javascript,Jquery,如何在Javascript中将数组(如[“Susy”、“John”、“Mary”]转换为“Susy、John和Mary”?我无法忘记Ruby的to_语句方法。您可以使用.join()并在最后一个值前面加上“and” 加入除最后一个项目外的所有项目,然后添加: var s = arr.slice(0, arr.length - 1).join(', ') + ", and " + arr.slice(-1); 演示:修改最后一个,然后加入 var source = ["Susy", "John"

如何在Javascript中将数组(如
[“Susy”、“John”、“Mary”]
转换为
“Susy、John和Mary”
?我无法忘记Ruby的to_语句方法。

您可以使用.join()并在最后一个值前面加上“and”


加入除最后一个项目外的所有项目,然后添加:

var s = arr.slice(0, arr.length - 1).join(', ') + ", and " + arr.slice(-1);

演示:

修改最后一个,然后加入

var source = ["Susy", "John", "Mary"];
source.push( 'and ' +source.pop());
console.log(source.join(', '))// Susy, John, and Mary
试试看:

var array = ['susy', 'john', 'mary'];
var last = array.pop();
var string = array.join(', ') + " and " + last;
我没有试过,但你应该得到这个想法和另一个解决方案:

(function(a) {
    var b = (a||(a=[])).pop(); 
    return (b ? a.length ? [a.join(", "),b] : [b] : a).join(" and ");
})(["Susy", "John", "Mary"]);
或者只是在array的原型中定义类似ruby的句子方法:

Array.prototype.sentence = function(comma,and) {
    var b = this.pop();
    return (b ? this.length ? [this.join(comma||", "),b] : [b] : this).join(and||" and ");
};

["Susy", "John", "Mary"].sentence(); 
//"Susy, John and Mary"

["Susy", "John", "Mary"].sentence(" and ", " as well as "); 
//"Susy and John as well as Mary"

["Susy", "John", "Mary", "Helmut"].sentence(); 
//"Susy, John, Mary and Helmut"

使用
Array.prototype.reduce
的另一个选项是:

var arr = [1,2,3];
arr.reduce(
  function(prev, curr, i){ 
    return prev + curr + ((i===arr.length-2) ? ' and ' : ', ')
  }, '')
.slice(0, -2);

产生
“1、2和3”

在这个例子中有一些额外的情况:

  • 我们想在“and”(牛津逗号)前面加一个逗号吗
  • 不管怎样,如果只有2个元素,我们都不需要逗号
  • 如果只有1个元素,我们只希望返回该单词
  • 我认为这适用于所有这些用例:

    function joinSentence( array, oxford_comma ){
      if( array.length > 1 ){
        var lastWord = " and " + array.pop();
        if( oxford_comma && array.length > 1 ){
          lastWord = "," + lastWord;
        }
      }else{
        var lastWord = "";
      }
      return array.join(", ") + lastWord;
    }
    
    使用最新的JavaScript(Chrome 72+):

    这将导致:

    "Susy, John, and Mary"
    

    我知道这个方法,在最后一项之前我想要“和”。我的坏,我没有看到“和”。。。让我再重复一次——美国人在“和”之前加上逗号。OP已经这样做了。@PopLaines:啊,那么你只需要使用
    +”和“++
    ”。我发现这个方法有几个问题。如果数组中只有1个元素,它将返回“and Susy”。对于两个元素,它返回“Susy和John”,这在语法上是不正确的。@Alex:是的,如果少于三项,则需要附加代码,但这超出了问题的范围。这里没有解决这个问题的答案。很好,但我认为如果你只关注所呈现的特定用例,你可能会得到类似jAndy的东西(笑话)答案:-)我已经发布了一个答案,涵盖了我能想到的最明显的情况。好吧,这更性感:)但是在和之前添加逗号在语法上正确吗?不适用于1和2个元素:[“Susy”]=>“和Susy”。[“苏西”、“约翰”]=>“苏西和约翰”没那么认真,但是<代码>[“苏西”、“约翰”、“玛丽”].join(',).split(/,M/).join('and M')这会产生
    “Susy,John,Mary”
    ,这不是期望的结果。哇,这将是伟大的,当它得到支持的时候!令人惊叹的!但不幸的是,其他浏览器仍然不太支持:(
    function joinSentence( array, oxford_comma ){
      if( array.length > 1 ){
        var lastWord = " and " + array.pop();
        if( oxford_comma && array.length > 1 ){
          lastWord = "," + lastWord;
        }
      }else{
        var lastWord = "";
      }
      return array.join(", ") + lastWord;
    }
    
    toSentence = function(arr){ return arr.join(", ").replace(/,\s([^,]+)$/, ' and $1');};
    
    toSentence(['dogs', 'cats']);           // => dogs and cats
    
    toSentence(['dogs', 'cats', 'snakes']); // => dogs, cats and snakes
    
    new Intl.ListFormat().format(["Susy", "John", "Mary"]);
    
    "Susy, John, and Mary"