首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数组JavaScript中查找重复项

在数组JavaScript中查找重复项
EN

Stack Overflow用户
提问于 2018-07-25 22:56:02
回答 3查看 164关注 0票数 1

所以我正在开发一个简单的基于网络的JavaScript游戏。目标是猜测一个X位数的随机数。这意味着随机数可以是4,5位,直到你想要的任何数字。你可以在www.juegodescifralo.com上玩这个游戏(它是西班牙语的,很抱歉)。

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

有三种可能的“值/数”类型:“好”的是您选择的与随机数组中的数字位置相同的数字。举个例子:

随机数组为: 1457

用户输入为: 6851

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

我开发的函数如下:

代码语言:javascript
运行
AI代码解释
复制
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;
}

这段代码有一点buggy。当随机数组中有重复项时,其中一个被标记为好的,那么另一个(即使它存在于用户输入中)将被设置为坏的,而不是应该设置为规则的。

事情变得更加复杂,因为你应该能够玩任何数量的数字。所以我应该能够猜出一个没有“问题”的20位数字。

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

我该怎么做呢?有什么想法可以让我更容易的访问数组数据吗?非常感谢!

EN

回答 3

Stack Overflow用户

发布于 2018-07-26 00:08:15

相比与-1indexOf比较和myArray[x]的检查,使用includes和数组方法(如forEach )来实现更好的抽象可能要容易得多。您真正需要的只是一个if、一个else if和一个else。例如:

代码语言:javascript
运行
AI代码解释
复制
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(''),
));

票数 0
EN

Stack Overflow用户

发布于 2018-07-26 01:02:19

我认为像这样循环两次会更容易。

代码语言:javascript
运行
AI代码解释
复制
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
  }
}

第一个循环是检查好的和坏的。并去掉它的值,它是好的,所以它不能被再次使用。

第二个循环检查规则,去掉它使用的值,这样它就不能再被使用了。

票数 0
EN

Stack Overflow用户

发布于 2018-07-31 15:40:38

这应该是可行的。

代码语言:javascript
运行
AI代码解释
复制
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));
代码语言:javascript
运行
AI代码解释
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51528762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档