用逗号和“和”连接数组

时间:2018-12-21 04:15:56

标签: javascript arrays string

我想将数组['one', 'two', 'three', 'four']转换为one, two, three and four

请注意,第一个项目带有逗号,但是倒数第二个和最后一个之间有一个单词and

我想出的最佳解决方案:

a.reduce( (res, v, i) => i === a.length - 2 ? res + v + ' and ' : res + v + ( i == a.length -1? '' : ', '), '' )

它基于在 end 处添加逗号-除了倒数第二个(a.length - 2)之外,还有一种避免最后一个逗号({{1 }}。

肯定有一种更好,更整洁,更聪明的方式来做到这一点吗?

在搜索引擎上进行搜索是一个很难的主题,因为它包含单词“ and” ...

8 个答案:

答案 0 :(得分:24)

一种选择是先var r = testArray.SkipWhile(x=>x.Equals("??")) .Reverse() .SkipWhile(x=>x.Equals("??")) .Reverse(); ,最后pop,其余所有都用逗号隔开,并与join和最后一项串联:

and

如果您无法更改输入数组,请改用const input = ['one', 'two', 'three', 'four']; const last = input.pop(); const result = input.join(', ') + ' and ' + last; console.log(result);,如果输入数组中可能只有一项,请先检查数组的长度:

slice

答案 1 :(得分:11)

我喜欢Mark Meyer的方法(如果有代表,我会赞成),因为它不会改变输入。这是我的旋转:

function makeCommaSeparatedString(arr, useOxfordComma) {
    const listStart = arr.slice(0, -1).join(', ');
    const listEnd = arr.slice(-1);
    const conjunction = arr.length <= 1 ? '' :
        useOxfordComma && arr.length > 2 ? ', and ' : ' and ';

    return [listStart, listEnd].join(conjunction);
}

console.log(makeCommaSeparatedString(['one', 'two', 'three', 'four']));
// one, two, three and four
console.log(makeCommaSeparatedString(['one', 'two', 'three', 'four'], true));
// one, two, three, and four
console.log(makeCommaSeparatedString(['one', 'two'], true));
// one and two
console.log(makeCommaSeparatedString(['one']));
// one
console.log(makeCommaSeparatedString([]));
// 

答案 2 :(得分:8)

从V8 v7.2和Chrome 72开始,您可以使用可爱的Intl.ListFormat API。还会在请求时处理列表的本地化,如果您需要它可能会很有帮助。

const lf = new Intl.ListFormat('en');
lf.format(['Frank']);
// → 'Frank'
lf.format(['Frank', 'Christine']);
// → 'Frank and Christine'
lf.format(['Frank', 'Christine', 'Flora']);
// → 'Frank, Christine, and Flora'
lf.format(['Frank', 'Christine', 'Flora', 'Harrison']);
// → 'Frank, Christine, Flora, and Harrison'

您甚至可以指定选项以使其中断,并使用“或”代替“ and”,或格式化诸如“ 3 ft,7 in”的单位。

参考
The Intl.ListFormat API - Google Developers
V8 release v7.2

答案 3 :(得分:7)

array.length大于1时,您可以使用Array.prototype.slice(),并排除其余情况:

a.length > 1 ? `${a.slice(0, -1).join(', ')} and ${a.slice(-1)}` : {0: '', 1: a[0]}[a.length]

代码示例:

const input1 = ['one', 'two', 'three', 'four'];
const input2 = ['A Tale of Two Cities', 'Harry Potter and the smth', 'One Fish, Two Fish, Red Fish, Blue Fish'];
const input3 = ['one', 'two'];
const input4 = ['one'];
const input5 = [];

const result = a => a.length > 1 
  ? `${a.slice(0, -1).join(', ')} and ${a.slice(-1)}` 
  : {0: '', 1: a[0]}[a.length];

console.log(result(input1));
console.log(result(input2));
console.log(result(input3));
console.log(result(input4));
console.log(result(input5));

答案 4 :(得分:3)

另一种方法可能是使用splice方法来删除数组的最后两个元素,并使用and令牌将它们连接起来。之后,您可以将该结果再次推送到数组上,最后使用,分隔符连接所有元素。


已更新至:

1)显示这种情况在多种情况下的工作原理(无需对数组长度进行额外控制)。

2)将逻辑包裹在方法内部。

3)请勿更改原始数组(如果不需要)。

let arrayToCustomStr = (arr, enableMutate) =>
{
    // Clone the received array (if required).
    let a = enableMutate ? arr : arr.slice(0);

    // Convert the array to custom string.
    let removed = a.splice(-2, 2);
    a.push(removed.join(" and "));
    return a.join(", ");
}

// First example, mutate of original array is disabled.
let input1 = ['one', 'two', 'three', 'four'];
console.log("Result for input1:" , arrayToCustomStr(input1));
console.log("Original input1:", input1);

// Second example, mutate of original array is enabled.
let input2 = ['one', 'two'];
console.log("Result for input2:", arrayToCustomStr(input2, true));
console.log("Original input2:", input2);

// Third example, lenght of array is 1.
let input3 = ['one'];
console.log("Result for input3:", arrayToCustomStr(input3));

// Fourth example, empty array.
let input4 = [];
console.log("Result for input4:", arrayToCustomStr(input4));

// Plus example.
let bob = [
    "Don't worry about a thing",
    "Cause every little thing",
    "Gonna be all right",
    "Saying, don't worry about a thing..."
];
console.log("Result for bob:", arrayToCustomStr(bob));
.as-console-wrapper {
    top: 0px;
    max-height: 100% !important;
}

答案 5 :(得分:2)

使用Array#reduce:

['one', 'two', 'three', 'four'].reduce( (a, b, i, array) => a + (i < array.length - 1 ? ', ' : ' and ') + b)

答案 6 :(得分:1)

Intl.ListFormat正是您想要的。尽管在2019年5月仅支持 Chrome 72 + Opera 60 + ,但polyfill可用于其他浏览器:https://github.com/zbraniecki/IntlListFormat

const list = ['A', 'B', 'C', 'D'];

// With Oxford comma 
const lfOxfordComma = new Intl.ListFormat('en', {
  style: 'long',
  type: 'conjunction'
});
console.log(lfOxfordComma.format(list)); // → A, B, C, and D


// Without Oxford comma 
const lfComma = new Intl.ListFormat('en-GB', {
  style: 'long',
  type: 'conjunction'
});
console.log(lfComma.format(list)); // → A, B, C and D

答案 7 :(得分:0)

一个简单的方法是使用正则表达式在最后一个单词或带引号的字符串之前插入 and。在堆栈溢出时回答 here