提问人:user3075373 提问时间:2/22/2020 最后编辑:user3075373 更新时间:2/24/2020 访问量:212
如何将带有分隔符的联接数组拆分为块
How to split joined array with delimiter into chunks
问:
我有字符串数组
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
]
答:
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);
这个想法是通过从(第二个参数到函数)的第一个元素开始,然后,对于()的每个剩余元素,检查它是否可以附加到累加器的最后一个元素()中,使用块()构建数组。累加器最终成为 的最终返回值,分配给 。result
arr
reduce
arr
arr.slice(1)
acc
reduce
result
评论
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
我会通过用第一个元素启动累加器并减少数组的其余部分来简化。我也会尝试用一些颠倒的西班牙语问号工作,只是为了好玩:-)
评论
anotherverylongword