Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何检查数组中哪些元素与位置匹配_Javascript_Arrays - Fatal编程技术网

Javascript 如何检查数组中哪些元素与位置匹配

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.

尝试创建一个或两个函数,该函数将能够检查数组的元素,并在两个数组的元素相同(即存在相同的数字和相同的位置)或数字存在但与另一个数组的位置不匹配时输出。基本上,我正在尝试重新创建一个简单的游戏,名为。我遇到的主要问题是,如果说正确答案是[1,2,3,4],用户会猜测[0,1,1,1],我的函数会显示数字1出现了3次,我需要弄清楚如何让它说数字1出现了1次。以下是检查阵列的函数:

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