如何.join()数组很好

luk*_*nis 23 javascript arrays string

我发现Array.prototype.join()在从数组构造字符串时非常有用的方法,比如

"one two three".split(' ').join(', ');
Run Code Online (Sandbox Code Playgroud)

但是我经常要生成这样的字符串:

"one, two and three"
Run Code Online (Sandbox Code Playgroud)

我使用的方法是这样的:

var parts = "one two three".split(' ');
parts.slice(0, parts.length-1).join(', ') + ' and ' + parts.slice(-1)
Run Code Online (Sandbox Code Playgroud)

这会产生我想要的东西,但是我应该把它放到一个单独的函数中.

我喜欢一个衬里,并相信在JS中应该有更优雅的单行程来完成这项任务.有人可以给我一个吗?

编辑

请不要评论编写不可读代码是一种不好的做法.我要一个!:)我从一个衬里学到了很多关于语言结构的知识,所以我看到了一种可能性.没有冒犯的意思.

最后的编辑 我很欣赏Pavlo的答案,因为它真实地展示了一个衬垫能够轻松地成为一个漂亮的可读代码.因为我要求一个班轮,所以根据我的问题,h2ooooooo获得最高分.

Pav*_*vlo 55

我对惊人的解决方案的数量和没有人使用的事实感到惊讶pop():

function splitJoin(source) {
    var array = source.split(' ');
    var lastItem = array.pop();

    if (array.length === 0) return lastItem;

    return array.join(', ') + ' and ' + lastItem;
}

splitJoin('one two three'); // 'one, two and three'
splitJoin('one two');       // 'one and two'
splitJoin('one');           // 'one'
Run Code Online (Sandbox Code Playgroud)

编辑:修改为适用于任何字符串.

  • @BoppreH因为我们在函数内部以任何方式创建该数组并不重要 - 为什么要关注我们是否弹出最后一个元素? (9认同)
  • @BoppreH,有什么意想不到的副作用? (3认同)
  • +1表示清洁溶液,-1表示意外副作用. (2认同)

h2o*_*ooo 18

它仍然是一个功能,但为什么不使用原型呢?

Array.prototype.joinNice = function() {
    return this.slice(0, this.length-1).join(', ') + ' and ' + this.slice(-1);
}

"one two three".split(' ').joinNice();
//one, two and three
Run Code Online (Sandbox Code Playgroud)

  • 出于前面提到的原因,方便,理智,但最重要的是一般的坏建议.不仅"标准"可能会创建一个类似的功能,但任何其他脚本也可能会这样做.基本上这带有相同的血液和痛苦*全局变量*. (12认同)
  • 好吧,我会回答"为什么不呢?" with:扩展本机主机对象一般都是一个非常糟糕的主意. (11认同)
  • @ h2ooooooo,[这是语言设计者的问题](http://jsfiddle.net/CmB2g/).您必须将原型扩展标记为不可枚举,因为它可以被`for..in`循环忽略,但这样做并不向后兼容,因此您仍然会失去浏览器支持. (3认同)
  • 为什么`slice(0,this.length - 1)`而不仅仅是`slice(0,-1)`? (2认同)

Cya*_*ish 10

我很惊讶没有人指出大多数这些答案都无法正常使用数组中的零个或一个元素.这是一个简单的解决方案,适用于0+元素:

function prettyJoin(array) {
    return array.length > 1
           ? array.slice(0, -1).join(", ") + " and " + array.slice(-1)
           : array + "";
}

prettyJoin([]);                          // ""
prettyJoin("one".split(" "));            // "one"
prettyJoin("one two".split(" "));        // "one and two"
prettyJoin("one two three".split(" "));  // "one, two and three"
Run Code Online (Sandbox Code Playgroud)