![](/img/trans.png)
[英]Find second largest elements in array with duplicates in 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 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(''), ));
我认为这样循环两次比较容易
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.