将字符串拆分为每个数组元素2个字符,长度为n个字符,然后将1个字符拆分为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","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;
}