Array для строки, разделенной запятыми, и для последнего тега используйте вместо 'и' вместо запятой в jquery

Я проверил много вопросов и ответов относительно массива join с запятой, разделенной строкой. Но моя проблема в том, что я делаю строку читаемой для человека, т.е. у меня есть массив меток, если они имеют два тега, тогда это будет tag1 and tag2 и если их 100 тегов, то для tag1, tag2, ,,,tag99 and tag100 будет tag1, tag2, ,,,tag99 and tag100 использовать and и перед использованием запятой в качестве разделителя.

Любой способ обработки в JQuery?

Ответ 1

Вы можете использовать .slice():

> var a = [1, 2, 3, 4, 5];
> [a.slice(0, -1).join(', '), a.slice(-1)[0]].join(a.length < 2 ? '' : ' and ');
'1, 2, 3, 4 and 5'
  • a.slice(0, -1).join(', '): принимает все, кроме последнего элемента, и соединяет их вместе с запятой.
  • a.slice(-1)[0]: это последний элемент.
  • .join(a.length < 2 ? '' : ' and '): соединяет эту строку и последний элемент с and, если есть как минимум два элемента.

Ответ 2

Еще одно быстрое решение - заменить последнюю запятую и.

Следующий код:

var a = [0,1,2,3,4];
a.join(', ').replace(/,(?!.*,)/gmi, ' and');

должен сделать трюк. (Кроме того, играйте с модификаторами регулярных выражений в соответствии с вашими потребностями).

Одна возможная проблема может быть временем, когда у вас большой массив, но он должен работать.

Ответ 3

Попробуйте следующее:

    var substr = new Array("One", "Two", "Three");
    var commaList = '';

    var i;
    for (i = 0; i < substr.length; ++i) {
        if (i == substr.length - 1)
            commaList += " and " + substr[i];
        else
            commaList += ", " + substr[i];
    }

    console.debug(commaList.substr(2, commaList.length));

Ответ 4

(примечание: вы можете перейти к концу, чтобы найти окончательный готовый код)


Однострочный ответ от Blender прекрасно работает, хотя я бы предпочел что-то более понятное:

function arrayToText(a) {
    if (a.length === 0) {
        return '';
    } else if (a.length === 1) {
        return String(a[0]); // cast to string, for consistency with the other cases
    } else if (a.length === 2) {
        return a.join(' and ');
    } else {
        return a.slice(0, -1).join(', ') + ' and ' + a[a.length-1];
    }
}

То же самое с помощью переключателя, посмотрите, как лучше читать:

function arrayToText(a) {
    switch (a.length) {
        case 0:
            return '';
        case 1:
            return String(a[0]); // cast to string, for consistency with the other cases
        case 2:
            return a.join(' and ');
        default:
            return a.slice(0, -1).join(', ') + ' and ' + a[a.length-1];
    }
}

Конечно, эти коды могут быть сокращены/оптимизированы, например, путем объединения случаев "0", "1" и "2" в просто a.join(' and ') из случая "2". Я позволю вам настроить эти коды на свой вкус :)

Наконец, вот мой конечный результат, я думаю, что он имеет большой баланс между понятностью, краткостью и эффективностью:

function arrayToText(a) {
    if (a.length <= 2) {
        return a.join(' and ');
    } else {
        return a.slice(0, -1).join(', ') + ' and ' + a[a.length-1];
    }
}

Ответ 5

Способен решить эту проблему, также используя Reduce.

arr.reduce((acc, curr, i) => i! == 0? acc + ${arr.length - 1 === i? and : ', '} + curr: curr, '');

Ответ 6

  • Создать строку, разделенную запятыми
  • Обратный текст
  • Заменить первое появление "," на "dna" ( "и" назад)
  • Повторите его снова
[1, 2, 3]
    .join(', ')
    .split('').reverse().join('')
    .replace(' ,', ' dna ')
    .split('').reverse().join('')