【问题标题】:Removing an element from an array when a pair is found找到一对时从数组中删除一个元素
【发布时间】:2014-08-05 13:39:25
【问题描述】:

这个功能是用来翻转我的记忆游戏中的牌,它负责找到对子。我试图通过在找到它们时删除它们来刷新板。假设我有 6 张卡片,并且找到了字母“A”。然后它应该从棋盘上移除对子“A”并随机化剩下的其他 4 张牌的位置。这是我函数中的 if 语句之一:

if(memoireValeur[0] == memoireValeur[1]){
                tempoArray.push(memoireValeur);
                carteFlip += 2;
                sum+=score;
                alert("Player 1: " +sum);

                for(var i=0;i<memoireArray.length;i++){
                    for(var j=0;j<memoireArray.length;j++){
                        if(memoireArray[i]==tempoArray[j]){
                            memoryArray=memoireArray.splice(i,1);

                        }
                    }
                }   
                document.write(memoryArray);

假设卡片是“A”、“A”、“B”、“B”、“C”、“C”。选择“A”对,然后这部分功能将从板/屏幕上删除“A”,并将其他 2 个字母留在板上。问题是 document.write(memoryArray) 应该显示“B”“B”“C”“C”,但事实并非如此。

【问题讨论】:

  • 我认为你应该说memoireArray.splice(i,1); memoryArray=memoireArray.splice(i,1); 尝试让我知道。
  • 还没有读完全文,但是你错过了一个括号},除非你忘了复制它。它是应该关闭第一个的括号。
  • Mritunjay 当我将其更改为 memoireArray.splice(i,1); 时并没有什么不同;

标签: javascript html if-statement for-loop


【解决方案1】:

我认为主要的问题是:

  1. 您正在将一组值推送到 tempoArray 变量中(在第 2 行),
  2. 使用错误的数组长度进行循环。
  3. 拼接改变了原来的数组,不要使用返回值

固定代码:

if (memoireValeur[0] == memoireValeur[1]) {
    tempoArray.push(memoireValeur[0]); // changed
    carteFlip += 2;
    sum += score;
    alert("Player 1: " + sum);

    for (var i = 0; i < memoireArray.length; i++) {
        for (var j = 0; j < tempoArray.length; j++) { //changed
            if (memoireArray[i] == tempoArray[j]) {
               memoireArray.splice(i, 1); // changed, splice changes the original array, no need to copy the return value

            }
        }
    }
    document.write(memoireArray);
}

一个更简单的方法可能是这样的:

if (memoireValeur[0] == memoireValeur[1]) {
    tempoArray.push(memoireValeur[0]);
    carteFlip += 2;
    sum += score;
    alert("Player 1: " + sum);

    memoryArray = memoireArray.filter(function(v) {
        return tempoArray.indexOf(v) == -1; // Keep any value in memoireArray that is not in tempoArray.
    });

    document.write(memoireArray);
}

【讨论】:

  • document.write(memoryArray) 仍然显示原始元素而不是新数组
  • 我在您的固定代码 tempoArray.push(memoireValeur[1]);并偶然将 document.write(memoryArray) 转换为 document.write(memoireArray) 并且它起作用了。谢谢
  • 是的,您将其更改为document.write(memoireArray) 是正确的,但tempoArray.push(memoireValeur[1]); 应该是不必要的。
【解决方案2】:

我认为问题就在这里。我得到的可能是问题

 memoryArray=memoireArray.splice(i,1);

splice 更改您调用函数的实际数组。并将拼接后的元素作为数组返回。

所以如果你有类似下面的东西

var arr = ['A','B','A','B']
arr = arr.splice(2,1); // value of arr will be ['A'] not ['A','B','A']

如果你想要 ['A','B','A'] 使用

arr.splice(2,1) //arr will have expected output

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 2013-05-27
    • 2018-11-16
    • 2013-10-04
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多