将字符串拆分为每个数组元素 2 个字符,长度为 n,然后将 JavaScript 中的剩余元素拆分为 1 个字符

Split string into 2 chars per array element for n length then 1 char for remaining elements in JavaScript

我有一个字符串(输入),稍后会转换为数组(结果)。数组的大小取决于所需的图块数 (tilesNeeded)。下面的示例包含一个 11 个字符的字符串。在这种情况下,需要 8 个图块。下面的代码输出:

["I", " ", "l", "i", "k", "e", " ", "dogs"]

数组的每个元素代表一个图块。所以“I”是它自己的图块,“”是一个图块,“l”是一个图块,等等。数组中的最后一个元素不是“dogs”,我想遍历字符串并在每个元素中放置 2 个字符元素,直到只剩下足够的字符来完成所需数组的长度(在本例中为 8 个)。

期望的输出:

["I ", "li", "ke", " ", "d", "o", "g", "s"]

JS代码

var input = "I like dogs"; // 11 chars
var tilesNeeded = Math.round(input.length / 2) + 1; // 7 tiles needed

if(isPrime(tilesNeeded)){
     tilesNeeded += 1; // 8 tiles needed
}

var result = input.match(new RegExp('.{1,' + Math.floor(input.length / tilesNeeded) + '}', 'g'));
               
while(result.length > tilesNeeded) {
     result[result.length - 2] += result[result.length - 1];
     result.splice(result.length - 1);
}

console.log(result); // ["I", " ", "l", "i", "k", "e", " ", "dogs"]

function isPrime(num){
     for(var i = 2, s = Math.sqrt(num); i <= s; i++)
          if(num % i === 0) return false; 
          return num > 1;
}

你在这里真的不需要正则表达式。试试下面的代码。

var input = "I like dogs"; // 11 chars
var tilesNeeded = Math.round(input.length / 2) + 1; // 7 tiles needed

if(isPrime(tilesNeeded)){
     tilesNeeded += 1; // 8 tiles needed
}
var start=0;
var jump=2;
var result=[];
while(start < input.length) {
     result.push(input.substring(start,start+jump));
     start+=jump;
     if(input.length-start==tilesNeeded-result.length)
     {
        jump=1;
     }
     
}

console.log(result); //["I ", "li", "ke", " ", "d", "o", "g", "s"]

function isPrime(num){
     for(var i = 2, s = Math.sqrt(num); i <= s; i++)
          if(num % i === 0) return false; 
          return num > 1;
}