29

我已经检查了许多关于使用逗号分隔字符串连接数组的问题和答案,但我的问题是,我正在使字符串对人类可读,即我有标签数组,如果它们是两个标签,那么它就是tag1 and tag2,如果它们是 100标记,那么在使用逗号作为分隔符之前tag1, tag2, ,,,tag99 and tag100,最后一个使用and 。and

有什么方法可以在 JQuery 中处理?

4

8 回答 8

80

您可以使用.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:如果至少有两个元素,则将该字符串和最后一个元素连接起来。
于 2013-04-27T11:59:54.227 回答
33

另一个快速解决方案是将最后一个逗号替换为 and。

以下代码:

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

应该做的伎俩。(另外,根据您的需要使用正则表达式修饰符)。

当您拥有大型阵列时,一个可能的问题可能是时间问题,但它应该可以工作。

于 2016-12-08T08:59:09.783 回答
2

尝试这个:

    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));
于 2013-04-27T12:01:48.393 回答
1

我为此使用正则表达式。

var words = ['One', 'Two', 'Three'];

var commaWord = words.join(', ');
Output: "One, Two, Three"

var commaAndWord = commaWord.replace(/,([^,]*)$/, ' and$1');
Output: "One, Two and Three"

var singleLine = words.join(', ').replace(/,([^,]*)$/, ' and$1');
Output: "One, Two and Three"
于 2020-12-07T13:05:41.900 回答
0

也可以使用reduce解决它:

let items = [1, 2, 3, 4, 5];
items.reduce((acc, curr, i) =>
    i !== 0 ? acc + `${items.length - 1 === i ? ` and  ` : ', '}` + curr : curr, '');
// "1, 2, 3, 4 and  5"
于 2019-07-15T06:15:44.390 回答
0

编辑:写完这个答案后,我看到@diegodsp的一个使用与我相同的正则表达式,所以我想我不小心偷了他的答案。那好吧!


这个对我很有用,如果你愿意,你可以使用牛津逗号。

const formatArray = (arr, oxfordComma = false) => 
  arr.join(", ").replace(/,([^,]+)$/g, `${oxfordComma ? "," : ""} and$1`);

const testArray = ["abc", "def", "efg", "abc abc", "fjdsakfj asd", "jfjfjf jfjfj"];
console.log(formatArray(testArray));
console.log(formatArray(testArray, true));

正则表达式的解释:

,- 匹配 ","
([^,]+)- 捕获除 "," 之外的任何字符一次或多次
$- 匹配行尾

$1替换字符串中的 表示捕获的单词。

于 2021-06-25T13:46:27.077 回答
0

(注意:您可以跳到最后找到最终的可供选择的代码)


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”案例合并到“2”案例中a.join(' and ')。我让你根据自己的喜好调整这些代码 :)

最后,这是我的最终结果,我认为它在可理解性、简短性和效率之间取得了很好的平衡:

function arrayToText(a) {
    if (a.length <= 2) {
        return a.join(' and ');
    } else {
        return a.slice(0, -1).join(', ') + ' and ' + a[a.length-1];
    }
}
于 2019-06-14T01:16:11.863 回答
-2

您还可以执行以下操作:

  1. 创建逗号分隔的字符串。
  2. 扭转它。
  3. ' ,'' dna '(''向后)替换第一次出现的位置。
  4. 再反过来。
[1, 2, 3]
  .join(', ')
  .split('').reverse().join('')
  .replace(' ,', ' dna ')
  .split('').reverse().join('')
于 2017-09-28T13:28:19.860 回答