检查字符串在javascript中是否有连续或重复的字符(下划线)

时间:2021-03-28 23:28:52

标签: javascript node.js refactoring

我有要重构的代码。我是 javascript 新手,所以我想使用下划线等库中的函数来制作更具可读性的代码。 下面的函数可以检测字符串 包含 3 个或更多有序字符,例如 (234, efg, LmN) 和 当字符串包含 3 个或更多重复时 (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;

      }

    }

我想看看我是否可以优化它并使用下划线使其更具可读性和/或什至使时间/空间复杂度更好。我知道这也可以用 regx 来完成,但我试图在没有它的情况下完成它。

1 个答案:

答案 0 :(得分:0)

我没有使用内部的 for 循环,而是使用 Array.prototype.slice() 将字符串分块为 n 以查看前面的 n 字符。我使用 Array.prototype.indexOf() 根据 abcnum 常量(ref)查找它是否是连续的。为了查看它是否重复,我使用了 Array.prototype.every() 循环遍历块并检查它们是否相似并根据表达式返回一个布尔值。

结果给出了找到的每个实例的输出,以及它是连续的还是重复的。

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

使用这种方法,我们一次查看字符串一个块(i+n)。例如(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]
相关问题