Javascript: хорошее удобочитаемое соединение списка

1

Имея список (массив) тегов ['tag1', 'tag2', 'tag3'] Я хочу создать приятный заголовок, например: Content tagged tag1, tag2 and tag3.

На данный момент у меня есть:

"Content tagged " + tags_titles.join(" and ");

с результатом: Content tagged tag1 and tag2 and tag3

Я знаю, что это простой вопрос, но мне любопытно, есть ли хорошее решение для этого случая.

Теги:

7 ответов

7
Лучший ответ

Вы можете получить два последних элемента и присоединиться к ним с помощью ' and ' и поместить его как последний элемент обратно в массив, а затем соединить все элементы с помощью ', ' для получения хорошей строки.

методы

  • Array#concat, объединяет два массива и возвращает новый массив

  • Array#splice, для получения двух последних элементов массива

  • Array#join, объединяет массив с данным разделителем.

Это предложение работает для любой длины массива, даже с одним или двумя элементами.

function nice(array) {
    return array.concat(array.splice(-2, 2).join(' and ')).join(', ');
}

console.log("Content tagged " + nice(['tag1']));
console.log("Content tagged " + nice(['tag1', 'tag2']));
console.log("Content tagged " + nice(['tag1', 'tag2', 'tag3']));
  • 0
    Вероятно, лучше обработать пустой / неопределенный array . Кроме того, перестань писать лучше JavaScript, чем я! ;)
  • 1
    @Jamiec, не стесняйтесь добавлять некоторые проверки здравомыслия.
Показать ещё 2 комментария
2

Немного нарезки и нарезки с использованием Array.prototype.slice:

function naturalLanguageJoin(arr){
    if(!arr)
       return '';
    if(arr.length<2)
       return (arr.length>0) ? arr[0] : '';
    return arr.slice(0,arr.length-1).join(", ") + " and " + arr[arr.length-1];
}

console.log(naturalLanguageJoin(['tag1', 'tag2', 'tag3']));
console.log(naturalLanguageJoin(['tag1', 'tag2']));
console.log(naturalLanguageJoin(['tag1']));
console.log(naturalLanguageJoin([]));
console.log(naturalLanguageJoin(null));
2

С моей точки зрения, это простой подход

var tags = ['tag1', 'tag2', 'tag3'];

console.log("Content tagged " + tags.slice(0, -1).join(', ')+' and '+tags.slice(-1));

Надеюсь, это поможет вам :) JsFiddle

2

Массив можно рассматривать как стек, поэтому вы можете вытащить последний элемент и в свою очередь записать это

var last = tags_titles.pop();
last = tags_titles.length ? ' and ${last}' : last;
'Content tagged ${tags_titles.join(", ")} ${last}'

В коде используются шаблоны строк ES6, которые я обычно считаю более читаемыми, чем выполнение конкатенации строк в коде. Он также использует тот факт, что поп-метод в основном выполняет операции. Получает lasst-элемент массива и мутирует массив. Это устраняет необходимость делать мутацию явно (используя срез)

  • 0
    что происходит с одним элементом?
  • 2
    @NinaScholz у тебя оксфордская запятая? ;)
Показать ещё 3 комментария
2

Что-то вроде этого будет моим подходом

function arrayFormat(arr) {
    var output = arr.splice(0, arr.length - 1).join(", ");
    output += " and " + arr[0];
    return output;
}
console.log(arrayFormat(["a", "b", "c"]));
2

Попробуйте это

var g = ['tag1', 'tag2', 'tag3'];
var title = g.slice(0, g.length-1).join(',').concat(' and ').concat(g[g.length-1]);
1

Попробуй это,

var arr = ['tag1', 'tag2', 'tag3']; 
var lastStr = arr.pop();
var str = "Content tagged " + arr.join(", ") + " and " + lastStr;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню