繁体   English   中英

在数组JavaScript中查找重复项

[英]Find duplicates in array JavaScript

因此,我正在研究一个简单的基于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;
}

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

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

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

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

与其对-1进行比较以及对myArray[x]进行检查,不如使用indexOf进行比较,而是使用includes和array方法(例如forEach来更好地抽象,可能会容易得多。 你真正需要的是一个if ,一个else ifelse 例如:

 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(''), )); 

我认为这样循环两次比较容易

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

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

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

这应该工作。

 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> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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