简体   繁体   中英

Check if String has sequential or repeated characters in javascript (underscore)

I have code that I am trying to refactor. Im new to javascript so Im tring to make more readable code using functions in libraries like underscore. The function below can detect when string contains 3 or more ordered characters such as (234, efg, LmN) and when string contains 3 or more repeated (lll, 444, MMm, @@@)

const input = "Dfdf123125";

    const myStr = input.toLowerCase();

    const n = 3;

    let isRepeating = false;

    let isSequential = false;

    for (let i = 0; i < myStr.length; i++) {

      if (i + (n - 1) <= myStr.length) {
 
        let isRepeatingTemp = false;

        let isSequentialTemp = false;

        for (let j = i; j < i + n; j++) {

           (myStr.charCodeAt(i) === myStr.charCodeAt(j)) ? isRepeatingTemp = true: isRepeatingTemp = false;

           (myStr.charCodeAt(i) === myStr.charCodeAt(j) - (n - 1)) ? isSequentialTemp = true : isSequentialTemp = false;

        }

        if (isRepeatingTemp) isRepeating = true;

        if (isSequentialTemp) isSequential = true;

      }

    }

Im trying to to see if I can optimize this and make it more readable with underscore and/or even make time/space complexity better. I know this can also be done with regx but im trying to get it done without it.

Instead of the inner for loop, I chunked the string to n using Array.prototype.slice() to see ahead n characters. I used Array.prototype.indexOf() to find if it's sequential based off the abc and num constants( ref ). To see if it's repeating, I used Array.prototype.every() that loops through the chunk and check if they're similar and return a boolean based on the expression.

The result gives the output of each instance found, and if it was sequential or repeating.

const input = "Dfdf123125";

function RepSeq(str, n) {
  var rep = false;
  var seq = false;
  var result = [];
  
  const num = '0123456789';
  const abc = 'abcdefghijklmnopqrstuvqxyz';
  
  if (str.length < n) return false;
  
  for (var i = 0; i < str.length; i++) {
    if (i + n <= str.length) {
      var chunk = str.slice(i, i + n);
      var seqABC = abc.indexOf(chunk) > -1;
      var seq123 = num.indexOf(chunk) > -1;
      
      if (seq123 || seqABC) {
        seq = true;
        result.push(chunk);
      }
      
      if ([...chunk].every(v => v.toLowerCase() === chunk[0].toLowerCase())) {
        rep = true;
        result.push(chunk);
      }
    } else break;
  }
  
  return {
    repetition: rep,
    sequential: seq,
    out: result
  };
}


console.log(RepSeq(input, 3));

// Output:
// {
//   out: ["123"],
//   repetition: false,
//   sequential: true
// }

With this method, we're peeking at the string one block( i + n ) at a time. Ex( n=3 ):

 1. [Dfd]f123125
 2. D[fdf]123125
 3. Df[df1]23125
 4. Dfd[f12]3125
 5. Dfdf[123]125 - Sequential!
 6. Dfdf1[231]25
 7. Dfdf12[312]5
 8. Dfdf123[125]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM