Имея список (массив) тегов ['tag1', 'tag2', 'tag3']
Я хочу создать приятный заголовок, например: Content tagged tag1, tag2 and tag3
.
На данный момент у меня есть:
"Content tagged " + tags_titles.join(" and ");
с результатом: Content tagged tag1 and tag2 and tag3
Я знаю, что это простой вопрос, но мне любопытно, есть ли хорошее решение для этого случая.
Вы можете получить два последних элемента и присоединиться к ним с помощью ' 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']));
Немного нарезки и нарезки с использованием 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));
С моей точки зрения, это простой подход
var tags = ['tag1', 'tag2', 'tag3'];
console.log("Content tagged " + tags.slice(0, -1).join(', ')+' and '+tags.slice(-1));
Надеюсь, это поможет вам :) JsFiddle
Массив можно рассматривать как стек, поэтому вы можете вытащить последний элемент и в свою очередь записать это
var last = tags_titles.pop();
last = tags_titles.length ? ' and ${last}' : last;
'Content tagged ${tags_titles.join(", ")} ${last}'
В коде используются шаблоны строк ES6, которые я обычно считаю более читаемыми, чем выполнение конкатенации строк в коде. Он также использует тот факт, что поп-метод в основном выполняет операции. Получает lasst-элемент массива и мутирует массив. Это устраняет необходимость делать мутацию явно (используя срез)
Что-то вроде этого будет моим подходом
function arrayFormat(arr) {
var output = arr.splice(0, arr.length - 1).join(", ");
output += " and " + arr[0];
return output;
}
console.log(arrayFormat(["a", "b", "c"]));
Попробуйте это
var g = ['tag1', 'tag2', 'tag3'];
var title = g.slice(0, g.length-1).join(',').concat(' and ').concat(g[g.length-1]);
Попробуй это,
var arr = ['tag1', 'tag2', 'tag3'];
var lastStr = arr.pop();
var str = "Content tagged " + arr.join(", ") + " and " + lastStr;
array
. Кроме того, перестань писать лучше JavaScript, чем я! ;)