如何将带有分隔符的联接数组拆分为块

How to split joined array with delimiter into chunks

提问人:user3075373 提问时间:2/22/2020 最后编辑:user3075373 更新时间:2/24/2020 访问量:212

问:

我有字符串数组

const arr = ['some', 'word', 'anotherverylongword', 'word', 'yyy', 'u']
const joined = arr.join(';')

我想获取连接字符串长度不大于 10 的块数组

例如,输出为:

[
    ['some;word'], // joined string length not greater than 10
    ['anotherverylongword'], // string length greater than 10, so is separated
    ['word;yyy;u'] // joined string length is 10
]
JavaScript 数组 字符串 拆分

评论

2赞 Wendelin 2/22/2020
我不明白,怎么办?anotherverylongword
0赞 user3075373 2/22/2020
@Wendelin如果长度大于 10,它应该保持在数组中

答:

3赞 Alberto Trindade Tavares 2/22/2020 #1

您可以使用 reduce(带有一些扩展语法slice)来生成这样的块:

const arr = ['some', 'word', 'anotherverylongword', 'word', 'yyy', 'u'];
const chunkSize = 10;

const result = arr.slice(1).reduce(
  (acc, cur) =>
    acc[acc.length - 1].length + cur.length + 1 > chunkSize
      ? [...acc, cur]
      : [...acc.slice(0, -1), `${acc[acc.length - 1]};${cur}`],
  [arr[0]]
);

console.log(result);

这个想法是通过从(第二个参数到函数)的第一个元素开始,然后,对于()的每个剩余元素,检查它是否可以附加到累加器的最后一个元素()中,使用块()构建数组。累加器最终成为 的最终返回值,分配给 。resultarrreducearrarr.slice(1)accreduceresult

评论

0赞 Wendelin 2/22/2020
因可读性差而投了反对票。使用带有 if / else 语句的函数体而不是 spread 将提高性能和可读性。push
1赞 Wendelin 2/22/2020
我对reduce没有问题,但嵌套的三元运算符。
1赞 user3075373 2/22/2020
有了这个解决方案,如果我改成它的输出,并且有 11 个字符,所以大于 10,所以应该分开'u''uu'[ 'some;word', 'anotherverylongword', 'word;yyy;uu' ]'word;yyy;uu''uu'
1赞 Alberto Trindade Tavares 2/22/2020
观察力很好,@user3075373。出现一个 off-by-one 错误。刚刚编辑了我的答案来解决这个问题。
1赞 danh 2/23/2020
我会通过用第一个元素启动累加器并减少数组的其余部分来简化。我也会尝试用一些颠倒的西班牙语问号工作,只是为了好玩:-)