Функция, вызываемая несколько раз внутри другого, вызывает ошибку TypeError: Невозможно прочитать свойство 'suit' из undefined - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь создать функцию, которая проверяет, имеют ли две колоды карт одинаковый порядок.

Я написал вспомогательную функцию, cardEq, для проверки, являются ли две карты одинаковыми, ионо работает.Он не работает в функции deckEq.

//Card Struct
//value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King
function Card(suit, value, color){
  this.suit = suit,
  this.value = value,
  this.color = color
}

//Check if two Cards are the same
function cardEq(card1, card2){
  if(card1.suit === card2.suit
     && card1.value === card2.value
     && card1.color === card2.color){
    return true;
  } else {return false;}
}

//Check if two Decks/arrays of Cards are in the same order
function deckEq(deck1, deck2){
  let i = 0;
  let flag = false;
  while (i < 53){
    let x = deck1[i];
    let y = deck2[i];
    if(cardEq(x, y) === true){
      flag = true;
      i = i + 1;
    } else {flag = false; break;}
  }
  return flag;
}

Я ожидал, что он вернет либо true, либо false, но вместо этого выдает ошибку: TypeError: Невозможно прочитать свойство 'suit' undefined в cardEq (repl:2:12) в deckEq (repl: 7: 8)

РЕДАКТИРОВАТЬ: я изменил (i <53) в операторе while на (i <52).Спасибо за улов @Christopher и @ traktor53.Я предполагаю, что проблема заключалась в том, что функция вызывала cardEq для элемента в массиве, который не существует (52-й).Поскольку это предназначено для сравнения колод, оно должно работать только с 51-м элементом (52-й картой). </p>

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Как предположил @Christopher, проблема заключается в проверке 53 карт в массиве из 52 карт с нулевой базой в deckEq.Измените оператор while в

  while (i < 52){

, чтобы он работал правильно с колодой из 52 карт -

"use strict";
//Card Struct
//value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King
function Card(suit, value, color){
  this.suit = suit,
  this.value = value,
  this.color = color
}

//Check if two Cards are the same
function cardEq(card1, card2){
  if(card1.suit === card2.suit
     && card1.value === card2.value
     && card1.color === card2.color){
    return true;
  } else {return false;}
}

//Check if two Decks/arrays of Cards are in the same order
function deckEq(deck1, deck2){
  let i = 0;
  let flag = false;
  while (i < 52){
    let x = deck1[i];
    let y = deck2[i];
    if(cardEq(x, y) === true){
      flag = true;
      i = i + 1;
    } else {flag = false; break;}
  }
  return flag;
}

function createDeck(){
    const deck = [];
    const colors = ["black", "red", "red", "black"];
    for( var i = 0; i < 52; ++i) {
        var suite = Math.floor( i / 13);
        var value = i % 13 + 1;
        var color = colors[ suite];
        deck.push( new Card( suite, value, color));
    }
    return deck;
}

let deck1 = createDeck();
let deck2 = createDeck();

console.log( deckEq( deck1, deck2));  // expect true
deck2[42] = deck2[0];
console.log( deckEq( deck1, deck2));  // expect false

Еще лучше использовать длину массива колоды, чтобы контролировать количество итераций цикла while, и проверять колоды одинаковой длины перед началом цикла.

0 голосов
/ 24 декабря 2018

this внутри функции работает только тогда, когда функция используется как " функция конструктора ", для которой требуется экземпляр new объекта, который создает функция конструктора.Это объект, к которому будет привязан this, иначе this будет привязан к window, а window не имеет свойства suit.

//Card Struct
//value 1 is ace, 11 is Jack, 12 is Queen, and 13 is King
function Card(suit, value, color){
  this.suit = suit,
  this.value = value,
  this.color = color
}

//Check if two Cards are the same
function cardEq(card1, card2){
  if(card1.suit === card2.suit
     && card1.value === card2.value
     && card1.color === card2.color){
    return true;
  } else {return false;}
}

//Check if two Decks/arrays of Cards are in the same order
function deckEq(deck1, deck2){
  let ceq = new cardEq(x,y); // <-- Need an instance produces by the function
  let i = 0;
  let flag = false;
  while (i < 53){
    let x = deck1[i];
    let y = deck2[i];
    if(ceq === true){  // <-- Use the instance
      flag = true;
      i = i + 1;
    } else {flag = false; break;}
  }
  return flag;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...