如何.join()数组很好

时间:2013-10-02 11:03:54

标签: javascript arrays string

我发现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 获得最高分。

7 个答案:

答案 0 :(得分: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'

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

答案 1 :(得分:18)

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

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

答案 2 :(得分: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"

答案 3 :(得分:3)

这个怎么样?

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

答案 4 :(得分:3)

"one two three".split(' ').join(', ').replace(/^(.+),/, "$1, and")

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

答案 5 :(得分: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

答案 6 :(得分:1)

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

parts.reduce(function(val1, val2, i, arr) {return val1 + (i + 1 < arr.length ? ', ' : ' and ') + val2});