Javascript 如何检查数组中哪些元素与位置匹配
尝试创建一个或两个函数,该函数将能够检查数组的元素,并在两个数组的元素相同(即存在相同的数字和相同的位置)或数字存在但与另一个数组的位置不匹配时输出。基本上,我正在尝试重新创建一个简单的游戏,名为。我遇到的主要问题是,如果说正确答案是[1,2,3,4],用户会猜测[0,1,1,1],我的函数会显示数字1出现了3次,我需要弄清楚如何让它说数字1出现了1次。以下是检查阵列的函数:Javascript 如何检查数组中哪些元素与位置匹配,javascript,arrays,Javascript,Arrays,尝试创建一个或两个函数,该函数将能够检查数组的元素,并在两个数组的元素相同(即存在相同的数字和相同的位置)或数字存在但与另一个数组的位置不匹配时输出。基本上,我正在尝试重新创建一个简单的游戏,名为。我遇到的主要问题是,如果说正确答案是[1,2,3,4],用户会猜测[0,1,1,1],我的函数会显示数字1出现了3次,我需要弄清楚如何让它说数字1出现了1次。以下是检查阵列的函数: function make_move(guess, answ){ var myguess = document.
function make_move(guess, answ){
var myguess = document.getElementById("mymoves");
var correct_number_correct_spot= 0;
var correct_number_wrong_spot= 0;
for(var i = 0; i < 4; ++i)
{
if(answ[i] == guess[i]){
++correct_number_correct_spot;
}
else if(answ[i] !== guess[i] && $.inArray(guess[i], answ) !== -1){
++correct_number_wrong_spot;
}
}
console.log(answ);
console.log(guess);
myguess.innerHTML += correct_number_correct_spot + " were right!" +correct_number_wrong_spot+ "there but not in the right order";
}
函数使移动(猜测,answ){
var myguess=document.getElementById(“mymoves”);
var correct\u number\u correct\u spot=0;
var正确号错误点=0;
对于(变量i=0;i<4;++i)
{
if(answ[i]==猜测[i]){
++正确的号码正确的地点;
}
else if(answ[i]!==guess[i]&&$.inArray(guess[i],answ)!=-1){
++纠正错误的位置;
}
}
控制台日志(answ);
console.log(猜测);
myguess.innerHTML+=正确的数字正确的点+“是对的!”+正确的数字错误的点+“有但顺序不对”;
}
试试这个
在不太改变原始函数的情况下,您可以使用对象作为映射来跟踪已匹配的数字
var number_matched = {};
// ...
if(!number_matched[guess[i]]) {
number_matched[guess[i]] = true;
}
您可以保留对象中未命中的数字的计数,并减去答案中出现的猜测数字。然后,您可以计算
correct\u number\u error\u spot
减去correct\u number\u correct\u spot
的数量和遗漏的数量
function make_move(guess, answ){
var myguess = document.getElementById("mymoves");
var correct_number_correct_spot = 0;
// Initialize missed counts to the numbers in the answer.
var correct_number_wrong_spot = answ.length;
var missed = {};
for (var j = 0; j < answ.length; j++) {
missed[answ[j]] = (missed[answ[j]] || 0) + 1;
}
for(var i = 0; i < answ.length; ++i)
{
if(answ[i] == guess[i]){
++correct_number_correct_spot;
}
// Subtract the guessed numbers from the missed counts.
if (guess[i] in missed) {
missed[guess[i]] = Math.max(0, missed[guess[i]] - 1);
}
}
// Subtract the correctly spotted numbers.
correct_number_wrong_spot -= correct_number_correct_spot;
// Subtract the remaining missed numbers.
for (var number in missed) {
correct_number_wrong_spot -= missed[number];
}
console.log(answ);
console.log(guess);
myguess.innerHTML += correct_number_correct_spot + " were right!" +correct_number_wrong_spot+ "there but not in the right order";
}
这是一种快速增加数字计数的方法,如果数字尚不存在,则将其初始化为0。该声明大致如下所示:
如果missed[answ[j]]
未定义,则它是未定义的,因此| |
(或运算符)计算为0
。否则,如果我们已经有一个大于0
的值,那么它就是,并且|
计算结果为包含的数字
如果它看起来很奇怪,您可以将此行替换为:
if (!(answ[j] in missed)) {
missed[answ[j]] = 0;
}
missed[answ[j]] += 1;
如果(missed中的guess[i]{missed[guess[i]]=Math.max(0,missed[guess[i]]]-1)
在这种情况下,我使用Math.max
来确保我们不会在0
以下进行减法。我们不希望猜测中的重复数字超过答案计数中出现的数字。我的意思是,我们最多减法,直到答案中的重复数字
if (missed[guess[i]] > 0) {
missed[guess[i]] -= 1;
}
如果可以接受,使用当前代码的最简单方法是使用inArray返回的索引重置应答中的值(对于正确位置的索引也是如此)。例如,将找到的索引上的答案设置为-1。但是,如果这意味着原始答案数组被更改,则必须首先克隆它。我没有看到像数组一样使用对象,你不是可以进行数字匹配[猜测[I]]这是如何工作的?这只是使用括号表示法引用对象属性。请参阅更多信息。仅尝试了几个示例,它看起来确实失败了,但仍然有一些偏差,例如:ans=[“3”、“6”、“3”、“4”]guess=2353只显示1个数字,但位置错误,但应该显示2个数字,但位置错误。以前没有看到“in”关键字,你能解释一下它是如何使用的吗?它看起来像是签入的,它创建了对象属性,然后检查它是否存在,很有趣。只是尝试了这个组合,但效果不太好,但几乎:这不是他回答:[“1”、“5”、“6”、“4”]我猜是2424。它说1是对的!1在这里,但顺序不正确。所以是计数两次。@codemonkey检查更新。我对你的代码做了一点修改,以保留遗漏的数字的计数,以便能够计算出
正确的数字\u错误的位置。
。winner winner鸡肉晚餐你介意解释一下这段代码是怎么做到的吗orks:for(var j=0;jmissed[guess[i]] = Math.max(0, missed[guess[i]] - 1);
if (missed[guess[i]] > 0) {
missed[guess[i]] -= 1;
}