Search code examples
javascriptarraysregexsplice

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


I have a string (input) that is later converted into an array (result). The size of the array is dependent on the number of tiles needed (tilesNeeded). The example below consists of an 11 char string. In this case, 8 tiles are needed. The below code outputs:

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

Each element of the array represents a tile. So "I" is its own tile, " " is a tile, "l" is a tile, etc. Instead of the last element in the array being "dogs," I want to loop through the string and place 2 chars in each element until just enough chars are left to finish the length of the desired array (8 in this case).

The desired output:

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

JS Code

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;
}

Solution

  • You dont really need regex here. Try below code.

    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;
    }