当我在嵌套的for循环中放置return false时,为什么会自动返回?

时间:2019-04-10 14:19:32

标签: javascript nested-loops

我正在尝试编写一个函数,如果手中有五张卡,则返回true。当我在最后一个大括号前放置return false时,它起作用。当我将return false放入嵌套的for循环内时,它会自动返回。为什么?

var cards = [
  {value: 4, suit: 'Clubs'},
  {value: 8, suit: 'Hearts'},
  {value: 7, suit: 'Spades'},
  {value: 5, suit: 'Clubs'},
  {value: 8, suit: 'Diamonds'},
  ]

function pair(handOfCards){
    for (var i=0; i<handOfCards.length; i++){
        for (var j=i+1; j<handOfCards.length; j++){
            if(handOfCards[i].value===handOfCards[j].value){
                return true
            }
            return false
        }
    }
}

6 个答案:

答案 0 :(得分:1)

要使您更进一步,可以使用单循环方法,并使用Set作为访问值。

function pair(handOfCards) {
    var i,
        values = new Set;

    for (i = 0; i < handOfCards.length; i++) {
        if (values.has(handOfCards[i].value)) { // check set
            return true;
        }
        values.add(handOfCards[i].value);       // add value to set
    }
    return false;
}

var cards1 = [{ value: 4, suit: 'Clubs' }, { value: 8, suit: 'Hearts' }, { value: 7, suit: 'Spades' }, { value: 5, suit: 'Clubs' }, { value: 8, suit: 'Diamonds' }],
    cards2 = [{ value: 4, suit: 'Clubs' }, { value: 8, suit: 'Diamonds' }];

console.log(pair(cards1)); //  true
console.log(pair(cards2)); // false

答案 1 :(得分:0)

如MDN中所述:

  

return语句结束函数执行并指定要返回给函数调用者的值。

MDN link

因此,问题在于,只要不满足您的条件,整个函数就会停止,因此for循环会中断,并且如果if失败,则返回false。

要解决该问题,只需将for循环的return语句移出,这样,如果未找到对,则返回false

function pair(handOfCards){
    for (var i=0; i<handOfCards.length; i++){
        for (var j=i+1; j<handOfCards.length; j++){
            if(handOfCards[i].value===handOfCards[j].value){
                return true;
            }
        }
    }
    return false; // <-- return false statement moved here.
}

正在工作的小提琴:https://jsfiddle.net/j92acpdn/

答案 2 :(得分:0)

i = 0第一次执行内部循环,这意味着您正在检查与card.value:4是否匹配

在当前位置返回false的情况下,它将在j = [1,..,4]处循环一次,如果没有其他值为4的牌,则将返回false。

返回false必须在循环之外,以允许检查所有值i = [1-4]。

答案 3 :(得分:-1)

这是JavaScript的工作方式:

  

return语句停止函数执行并返回一个   该函数的值。

参考:https://www.w3schools.com/jsref/jsref_return.asp

答案 4 :(得分:-1)

return语句停止进一步执行该功能。在您的代码中,无论是否满足条件,它都将返回值。

即使您将else放在return false之前,它仍然会这样做,而return会在第一个循环中这样做。

答案 5 :(得分:-1)

如果您将代码分解为该for循环:

for (var j=i+1; j<handOfCards.length; j++){
            if(handOfCards[i].value===handOfCards[j].value){
                return true
            }
            return false
}

您可以看到在if语句之后立即调用return false,这意味着它将仅经历for循环的1次迭代,然后返回false。

解决此问题的一种方法是添加一个初始化为false的布尔值found。找到匹配项时,不要将找到的布尔值更改为true,而是返回true。在函数末尾,返回found值,无论是真还是假。