我已经检查了许多关于使用逗号分隔字符串连接数组的问题和答案,但我的问题是,我正在使字符串对人类可读,即我有标签数组,如果它们是两个标签,那么它就是tag1 and tag2
,如果它们是 100标记,那么在使用逗号作为分隔符之前tag1, tag2, ,,,tag99 and tag100
,最后一个使用and 。and
有什么方法可以在 JQuery 中处理?
我已经检查了许多关于使用逗号分隔字符串连接数组的问题和答案,但我的问题是,我正在使字符串对人类可读,即我有标签数组,如果它们是两个标签,那么它就是tag1 and tag2
,如果它们是 100标记,那么在使用逗号作为分隔符之前tag1, tag2, ,,,tag99 and tag100
,最后一个使用and 。and
有什么方法可以在 JQuery 中处理?
您可以使用.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
:如果至少有两个元素,则将该字符串和最后一个元素连接起来。另一个快速解决方案是将最后一个逗号替换为 and。
以下代码:
var a = [0,1,2,3,4];
a.join(', ').replace(/,(?!.*,)/gmi, ' and');
应该做的伎俩。(另外,根据您的需要使用正则表达式修饰符)。
当您拥有大型阵列时,一个可能的问题可能是时间问题,但它应该可以工作。
尝试这个:
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));
我为此使用正则表达式。
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"
也可以使用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"
编辑:写完这个答案后,我看到@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
替换字符串中的 表示捕获的单词。
(注意:您可以跳到最后找到最终的可供选择的代码)
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];
}
}
您还可以执行以下操作:
' ,'
用' dna '
('
和'
向后)替换第一次出现的位置。[1, 2, 3]
.join(', ')
.split('').reverse().join('')
.replace(' ,', ' dna ')
.split('').reverse().join('')