在数组JavaScript中查找重复项

时间:2018-07-25 22:56:02

标签: javascript arrays loops

所以我正在研究一个简单的基于JavaScript的基于Web的游戏。目的是猜测X位数的随机数。这意味着随机数可以是4、5位数字,最多可以是您想要的。您实际上可以在www.juegodescifralo.com上玩游戏(用西班牙语,对此感到抱歉)。

用户输入一个存储为数组的数字。随机数也作为数组生成。两个数组中的单个数字可以重复。

可能的“值/数字”有三种类型:“好”数字是您选择的与随机数组中的数字处于同一位置的数字。例如:

随机数组为:14 5 7

用户输入为:68 5 1

数字5是一个“好”数字,因为它在同一位置。然后是第二种类型的“值”,即“常规”。这意味着它们在随机数内,但不在同一位置。在此示例中,数字1将是“常规”值。第三种是“坏”类型,甚至不在随机数组中。

我开发的功能如下:

function checkNumbers(randomArray, myArray, good, regular, bad) {
    for (var x = 0; x < randomArray.length; x++) {
        var posRepetido = randomArray.indexOf(myArray[x]); //Is current number inside random array?

        if (posRepetido == -1) { //It's not inside
            console.log("number " + myArray[x] + "is not inside");
            bad++;

        } else { //It's inside

            regular++;

            if (myArray[x] == randomArray[x]) { //If it's the same number...
                console.log("number " + myArray[x] + "is in the correct position");

                good++;
                regular--;
            } else { //If it's not the same number

                if (randomArray[posRepetido] != myArray[posRepetido]) {
                    console.log("number " + myArray[x] + "is inside but not in the same position");

                } else {
                    console.log("number " + myArray[x] + "is not inside");

                }
            }
        }
    }

    var obj = { //Return object for accessing later, to show feedback to the user.
        good: good,
        regular: regular,
        bad: bad
    };

    return obj;
}

代码有点错误。如果随机数组中有重复项,并且其中之一被标记为好,则另一项(即使在用户输入中存在)也将被设置为错误,而不是应有的规则。

事情变得更加复杂,因为您应该能够与任意数量的数字对战。因此,我应该能够猜出一个20位数字而没有“问题”。

您可以在www.juegodescifralo.com上自己玩

我该如何处理?有什么想法可以使我更轻松地访问阵列数据吗?非常感谢你!

3 个答案:

答案 0 :(得分:0)

与其indexOf-1的比较和myArray[x]的检查,不如使用includes和诸如forEach的数组方法,要容易得多以获得更好的抽象。您真正需要的只是一个if,一个else if和一个else。例如:

function checkNumbers(randomArray, userArray, good=0, regular=0, bad=0) {
  userArray.forEach((guess, i) => {
    if (guess === randomArray[i]) good++;
    else if (randomArray.includes(guess)) regular++;
    else bad++;
  });
  return { good, regular, bad };
}



// 4 good
console.log(checkNumbers(
  '1234'.split(''),
  '1234'.split(''),
));
// 4 good, 2 bad
console.log(checkNumbers(
  '1234'.split(''),
  '123456'.split(''),
));
// 4 good, 2 regular
console.log(checkNumbers(
  '1234'.split(''),
  '123412'.split(''),
));
// all regular:
console.log(checkNumbers(
  '123456789123456789'.split(''),
  '912345678912345678'.split(''),
));

答案 1 :(得分:0)

我认为这样循环两次很容易

function checkNumbers(randomArray, guessArray) {
  var clone = randomArray.slice(0);
  var good = 0;
  var regular = 0;
  var bad  = 0;
  var visited = [];

  guessArray.forEach(function(guess, index) {
    if (guess === clone[index]) { // the guess is in right position
      good++;
      clone[index] = "x"; // strike it out so it cannot be used later
      visited.push(index);
    } else if (clone.indexOf(guess) === -1) {
      bad++;
      visited.push(index);
    }
  });
  guessArray.forEach(function(guess, index) {
    if (!visited.includes(index)) {
      var match = clone.indexOf(guess);
      if (match !== -1) {
        regular++;
        clone[match] = "x"; // strike it out so it cannot be used later
      }
    }
  });

  return {
    good: good,
    bad: bad,
    regular: regular
  }
}

第一个循环是检查好坏。并剔除该值是好的,因此不能再次使用。

第二个循环,用于检查常规值并删除其使用的值,因此无法再次使用。

答案 2 :(得分:0)

这应该有效。

function guessNumber (numUser, numRandom) {
    if (typeof numUser == 'number') {
        numUser = numUser.toString().split('');
    }
    if (typeof numRandom == 'number') {
        numRandom = numRandom.toString().split('');
    }
 
    if (typeof numRandom != 'object' || typeof numUser != 'object') {
        return false;
    }
 
    if (numRandom == numUser) {
        return true;
    }
 
    var numRegular = {},
        numBuenos = {},
        numMalos = {},
    numRepeat = {};
 
 
    for(var i  = 0; i < numRandom.length; i++) {
      if (!numRepeat[numRandom[i]]) {
        numRepeat[numRandom[i]] = 0;
    }
      numRegular[numRandom[i]] = 0;
      numRepeat[numRandom[i]]++;
  }
 
 
    for (var i  = 0; i < numUser.length; i++) {
        if (numUser[i] == numRandom[i]) {
            numBuenos[numUser[i]] = numUser[i];
        }else if ($.inArray(numUser[i], numRandom)) {
      if (!numRegular[numUser[i]]) {
        numRegular[numUser[i]] = 0;
      }
      if (numRegular[numUser[i]] < numRepeat[numUser[i]]) {
          numRegular[numUser[i]]++;
      } else {
                numMalos[numUser[i]] = numUser[i];
      }
        } else {
            numMalos[numUser[i]] = numUser[i];
        }
    }
 
 
    return {
        regular: Object.values(numRegular).reduce((a, b) => a + b),
        buenos: Object.keys(numBuenos).length,
        malos: Object.keys(numMalos).length
    };
 
}
 
console.log(guessNumber(8365, 8512));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>