我有一个这样的电话。
const number = 123456789;
我想像
[1, 2345, 6789]
或['1','2345','6789']
那样分割它;我发现
match()
与Regex
。console.log(number.toString().match(/.{1,4}/g));
返回
['1234', '5678', '9']
它看起来做得不错,但是我想要的是相反的结果。
因此,我为此做了一个棘手的流程。
console.log(number.toString().split('').reverse().join('').match(/.{1,4}/g));
所以,现在我得到
['9876','5432','1']
但这还不是我想要的。
console.log(
number.toString().split('').reverse().join('').match(/.{1,4}/g).map(str=>str.split('').reverse().join('')).reverse());
最后,我可以获得想要的结果。
但是它看起来很丑陋且效率低下。
即使我认为也不应该在代码上使用它。
因此,我的问题是如何有效地在每个
nth
位置拆分数字? 最佳答案
如果要缩短代码长度,请使用1个或4个字符,同时对0个或更多的.{4}
组使用负的超前查询,后跟$
(字符串的结尾):
const number = 123456789;
console.log(
number.toString().match(/.{1,4}(?=(?:.{4})*$)/g)
);
但这需要在每个匹配项中检查从匹配项到字符串末尾的字符数,这总体上是一个
O(n ^ 2)
过程。为了提高效率,请首先检查字符串的长度,然后使用模取所需的任意数量的字符,以使其余字符串的长度为4的倍数:const str = String(123456789);
const index = str.length % 4;
const firstItem = str.slice(0, index);
const items = str.slice(index).match(/\d{4}/g);
items.unshift(firstItem);
console.log(items);
该代码更长,但是在
O(n)
中运行。