Подтвердить что ты не робот

Как .join() массивы красиво

Я нахожу метод 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 получает самый высокий балл.

4b9b3361

Ответ 1

Это еще функция, но почему бы не использовать 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

Меня удивляет количество загадочных решений и тот факт, что никто не использовал 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'

Изменить: Изменено для правильной работы для любой строки.

Ответ 3

Я удивлен, что никто не указал, что большинство из этих ответов не будут работать должным образом с нулем или одним элементом в массиве. Здесь простое решение, которое отлично работает для элементов 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"

Ответ 4

Как насчет этого?

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

Ответ 5

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

(Это еще более грамматически правильно!) Хотя он не будет работать так, как ожидалось, если последняя часть сама содержит запятую.

Ответ 6

Если вам нужен один вкладыш

"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

Ответ 7

Я не говорю это довольно, хотя. Или поддерживается во всех браузерах.

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