Как .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 получает самый высокий балл.
Ответы
Ответ 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});