我有一个这样的电话。

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)中运行。

08-25 01:57