23

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

"one two three".split(' ').join(', ');

但很多时候我想生成这样的字符串:

"one, two and three"

我使用的方法是这样的:

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

这会产生我想要的东西,但是我应该将它放入一个单独的函数中,这是一个丑陋的解决方案。

我喜欢单线,并且相信 JS 中应该有更优雅的单线来完成这项任务。有人可以给我一个吗?

编辑

请不要评论说编写不可读的代码是一种不好的做法。我要一个!:) 我从一个班轮中学到了很多关于语言结构的知识,因此有一种情况,我看到了一种可能性。没有冒犯的意思。

最终编辑 我很欣赏Pavlo的回答,因为它确实显示了一个班轮可以多么容易地成为一个漂亮的可读代码。因为我要求一个班轮所以根据我的问题h2ooooooo获得最高分。

4

7 回答 7

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'

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

于 2013-10-02T11:23:27.457 回答
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
于 2013-10-02T11:07:33.397 回答
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"
于 2013-10-02T19:54:10.583 回答
3

那这个呢?

(parts = "one two three".split(" ")).slice(0, parts.length - 1).join(", ") + " and " + parts.slice(-1);
于 2013-10-02T11:08:09.200 回答
3
"one two three".split(' ').join(', ').replace(/^(.+),/, "$1, and")

(它在语法上更正确!)尽管如果最后一部分本身包含逗号,它将无法按预期工作。

于 2013-10-02T11:17:32.130 回答
2

如果你想要一个班轮

"one, two and three"  

比较笼统一点。。

function splitJoin (str,del,arr) {
    for (x=str.split (del),i=x.length;i--;x[i]+=(arr[i]||"")); return x.join("");
}

console.log (
    splitJoin ("one two three"," ", [", "," and "])
) //one, two and three
于 2013-10-02T11:08:44.717 回答
1

我不是说它很漂亮。或者在所有浏览器中都支持。

parts.reduce(function(val1, val2, i, arr) {return val1 + (i + 1 < arr.length ? ', ' : ' and ') + val2});
于 2013-10-02T11:18:22.893 回答