通过拆分数字循环javascript

时间:2019-01-07 21:54:08

标签: javascript arrays loops

我有这个功能,我想遍历两个字符串和 收到最接近它的compareNumber的返回值-即(compareNumber +1),但前提是它的任何一个数字都不等于searchNumber的任何数字。如果compareNumber的任何数字等于searchNumber的任何数字,我需要查找大于compareNumber的第一个值,该值不等于searchNumber的任何数字。

  checkboxMutator = function (value, data) {
        return '<input type="checkbox" class="rowCheckBox" name="' + value + '">';
}

3 个答案:

答案 0 :(得分:0)

代码如下:

function compareNumbers(searchNumber, compareNumber) {
  //error check the args
  var searchString = searchNumber + "";
  var compareString = compareNumber + "";

  if (compareString.length === 0) return "nope";
  var compareInt = parseInt(compareString) + 1;
  if (searchString.length === 0) {
    return compareInt;
  }

  //don't crash the app
  if (searchString.length >= 10 
    && searchString.indexOf("0") >= 0 && searchString.indexOf("1") >= 0 
    && searchString.indexOf("2") >= 0 && searchString.indexOf("3") >= 0 
    && searchString.indexOf("4") >= 0 && searchString.indexOf("5") >= 0 
    && searchString.indexOf("6") >= 0 && searchString.indexOf("7") >= 0 
    && searchString.indexOf("8") >= 0 && searchString.indexOf("9") >= 0 ) {
      return "nope";
  }

  while(containsDigits(searchString, compareInt)) {
    compareInt++;
  }

  return compareInt;
}
    
function containsDigits(digits, intVal) {
  var strVal = intVal + "";
  var strDigits = digits + "";
  for(var i = 0; i < strDigits.length; i++) {
    if (strVal.indexOf(strDigits.charAt(i)) >= 0) {
      return true;
    }
  }
  return false;
}

// Examples
pairs = [[123, 124], [11, 13], [25, 35], [15, 21], [138, 546], [1, 2], [1, 1]];
pairs.forEach((pair) => console.log(`Compare [${pair[0]}, ${pair[1]}]: ${compareNumbers(pair[0], pair[1])}`));

答案 1 :(得分:0)

我认为最好从数学角度考虑这一点,而不是一直加1直到找到一个有效的数字为止。

下面的解决方案迭代每个数字,将其递增1直到找到允许使用的数字。做出更改后,我们知道其余数字将替换为可用的最小数字。

把它想成一个密码锁,只是一旦您转动一个转盘,转盘上的所有数字就会重置为我们允许使用的最低数字。

function compareNumbers(n1, n2) {
  var n1Array = ("" + n1).split("").map(Number);
  var n2Array = ("" + n2).split("").map(Number);
  var availableNumbers = [...Array(10).keys()].filter(n => !n1Array.includes(n));

  //Loop through each digit in our compare string
  n2Array.some((n, index) => {
    let originalN = n;
    
    //Increment it until we have a valid number
    while (!availableNumbers.includes(n)) 
      if (n < 9)  n++
      else {
        //If we've passed 9, then we need to use the lowest number *twice*
        //However, if we're changing the first number, we CAN'T replace it with a 0
        n = Number((index === 0 ? availableNumbers[0] || availableNumbers[1] : availableNumbers[0]).toString() + availableNumbers[0]);
        break;
      }

    if (originalN !== n) {
      n2Array[index] = n;
      var replacements = n2Array.splice(index + 1).map(n => availableNumbers[0]);
      n2Array = [...n2Array, ...replacements];
      return true; //Exit early
    }

    return false;  //Keep iterating
  });

  //Turn [4,0,0] into 400
  return Number(n2Array.join(""));
}

let result1 = compareNumbers(123,124);
console.log(result1);

let result2 = compareNumbers(123,423);
console.log(result2);

很多草率的/难看的东西是边缘情况的原因。

第一个极端情况是,如果我们增加9,那么它就不应该成为10,而是我们可以使用的最低数字重复两次

但是,有一个内部的极端情况。如果我们的最低可用数字是0,而9是我们的第一个数字,则我们不能将其替换为00。否则,您可能最终将915变成0015

答案 2 :(得分:-2)

您无需拆分字符串即可以数组形式访问其内容。

.transition