我有一个字符串1234567890
。
我想将其每4
个字符或n
划分。
必须从字符串末尾开始
在上述情况下,它将为["12", "3456", "7890"]
。
123
=> ["123"]
12345
=> ["1","2345"]
我从这里找到了类似的答案,我进行了编辑,但没有用。
function getChunks(number, size) {
let str = number.toString(),
length = str.length - size + 1;
return Array.from({ length }, (_,i) => +str.slice(i*size, (i*size) + size))
}
console.log(getChunks(1234,4));
console.log(getChunks(12345,4));
console.log(getChunks(123,4));
console.log(getChunks(1234567890,4));
答案 0 :(得分:3)
一种快速的解决方法如下:
String.prototype.slice()
与索引-4
一起使用,以获取字符串的最后4个字符。 str
更新原始字符串str.slice(0,-4)
,以删除最后四个字符。str.length
为0
。循环中的最后一个str
的长度不能超过4个字符,并且不会影响String.prototype.slice()
的使用。Array.prototype.reverse()
对数组进行正确排序。
let str = "1234567890";
let segments = [];
while (str.length) {
segments.push(str.slice(-4));
str = str.slice(0, -4);
}
segments.reverse();
console.log(segments);
答案 1 :(得分:1)
要更正您的初始代码,它有两个问题。
str.length - size + 1
将为您提供错误的结果。假设str.length === 10
和size = 4
,那将是10 - 4 + 1
,这将为您提供7
。
size
放入str.length
的次数。您还需要四舍五入。因此,str.length === 8
和size === 4
将产生2
,而str.length === 10
和size === 4
是3
。 Math.ceil(str.length / size)
str.slice(i*size, (i*size) + size)
完成的分块试图使前一组尽可能大,而最后一组可能较小。而您需要相反效果-最后一组应尽可能小,第一个组将具有足够的项目来容纳剩下的所有内容。
10 % 4 === 2
。因此,第一组必须包含两个项目。由于这确定了组的 size ,因此这意味着必须将其作为起始索引和结束索引的偏移量来考虑。不幸的是,这使公式变得非常烦人-您需要一个{em}的 maximum 差异和一个size
的 minimum 差异。第一个起点应始终为remainder
,第一个终点应为0
,然后每个后续迭代中,都需要在起点和终点都添加remainder
。但是,第一个和第二个 size
索引可以小于start
。正如我所说的那样,烦人,所以您想要的公式是size
-对于start = Math.max(0, size*(i - 1) + remainder)
,您可以变为负数,但将其最小限为零。您将从i = 0
开始第二次迭代。因此进度为remainder
,依此类推。0 -> remainder -> remainder + size -> remainder + size + size
-将end = remainder + size * i
添加为偏移量,每次仅增加remainder
。进度为size
等。remainder -> remainder + size -> remainder + size + size
-非常重要,但留在最后。我认为,一旦您知道remainder = (str.length % size) || size
和start
的工作原理,它就会更加有意义。 end
的这个定义解决了remainder
被str.length
完全整除时会发生的问题。在不使用size
而不是size
的情况下,您会遇到0
和str.length === 4
的问题,size === 4
公式会给我们end
。因此,换句话说,因此我们必须将其定义为0
。所有这些都会产生更正的版本:
0 > remainder >= size
我只想显示原始版本在工作时的外观。我不会诚实地推荐它,因为它不容易阅读。有多种方法可以重新排列公式,但总体上还是不太直观。