Внутри функции >>> TypeError: Невозможно прочитать свойство 'length' из неопределенного - PullRequest
0 голосов
/ 06 февраля 2020

Это код для проверки номера кредитной карты в соответствии с заданными требованиями. Я сделал код таким образом, чтобы он соответствовал всем функциям проверки в основной функции, и он хорошо работает таким образом. Однако я хотел немного привести в порядок свой код и сделать его более практичным, чтобы код теперь был таким. Я думаю, что у меня есть часть функций, которые я до сих пор не могу полностью понять. Подскажите, пожалуйста, в чем здесь моя ошибка? Любой вклад приветствуется.

'use strict';
let cardNumLength = getLength();
let isNumOnly = /^\d+$/.test(cardNum);
let isLastDigitEven = isEndEven();
let isSumValid = isSumGreaterThan16();
let allDigitsNotSame = allEqualCheck(cardNum);
let errorArray = [];

function cardNumValidator(cardNum) {
    if (cardNumLength, isNumOnly, isLastDigitEven, isSumValid, allDigitsNotSame) {
        console.log(`"${cardNum}" is a valid credit card number.`);
        return
    }
    return errorArray;
}

// getLength function to check if the number has 16 digits
function getLength(cardNum) {
    //console.log(cardNum.length); //debugging
    if (cardNum.length == 16) {
        return true;
    }
    return false;
}

// to check the final digit if its even
function isEndEven(cardNum) {

    if (cardNum[cardNum.length - 1] % 2 == 0) {
        return true;
    }
    return false;
}

// to check if the sum of the digits are greater than 16
function isSumGreaterThan16(cardNum) {
    let intCardNum = parseInt(cardNum);
    let sum = 0;
    for (let i = 0; i < cardNum.length; i++) {
        sum = parseInt(sum) + parseInt(cardNum[i]); //parseInt() converts string into number
    }
    if (sum > 16) {
        return true;
    }
    return false;
}

function allEqualCheck(cardNum) {
    if (cardNum.split('').every(char => char === cardNum[0])) {
        return false;
    }
    return true;
}

/* using switch statement to final validation regarding to the requirements those checked seperately by previous inner functions*/
function isValidError() {
    if (cardNumLength === false) {
        errorArray.push('Number must be 16 digits!');
    } else if (isNumOnly === false) {
        errorArray.push('Invalid characters!');
    } else if (isLastDigitEven === false) {
        errorArray.push('Odd final number!');
    } else if (isSumValid === false) {
        errorArray.push('Sum less than 16!');
    } else if (allDigitsNotSame === false) {
        errorArray.push('All numbers can not be the same!');
    }
    return errorArray;
}
cardNumValidator('9999777788880000'); //valid number example
cardNumValidator('6666666666661666'); //valid number example

cardNumValidator('a92332119c011112'); //Invalid number example
cardNumValidator('4444444444444444'); //Invalid number example
cardNumValidator('1111111111111110'); //Invalid number example
cardNumValidator('6666666666666661'); //Invalid number example

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Я использую глобальные переменные, как вы, но устанавливаю их в зависимости от cardNum. Функция cardNumValidator теперь всегда будет возвращать массив ошибок, который будет иметь нулевую длину при отсутствии ошибок. При наличии нескольких ошибок в массиве errorArray будут все, а не только одна.

'use strict';
let cardNumLength = false;
let isNumOnly = false;
let isLastDigitEven = false;
let isSumValid = false;
let allDigitsNotSame = false;
let errorArray = [];

function cardNumValidator(cardNum) {
	cardNumLength = getLength(cardNum);
	isNumOnly = /^\d+$/.test(cardNum);
	isLastDigitEven = isEndEven(cardNum);
	isSumValid = isSumGreaterThan16(cardNum);
	allDigitsNotSame = allEqualCheck(cardNum);

	errorArray = [];
	isValidError();

    if (errorArray.length == 0) {
        console.log(`"${cardNum}" is a valid credit card number.`);
    } else {
        console.log(`"${cardNum}" is an invalid credit card number.`);
        console.dir(errorArray);
    }
    return errorArray;
}

// getLength function to check if the number has 16 digits
function getLength(cardNum) {
    //console.log(cardNum.length); //debugging
    if (cardNum.length == 16) {
        return true;
    }
    return false;
}

// to check the final digit if its even
function isEndEven(cardNum) {

    if (cardNum[cardNum.length - 1] % 2 == 0) {
        return true;
    }
    return false;
}

// to check if the sum of the digits are greater than 16
function isSumGreaterThan16(cardNum) {
    let intCardNum = parseInt(cardNum);
    let sum = 0;
    for (let i = 0; i < cardNum.length; i++) {
        sum = parseInt(sum) + parseInt(cardNum[i]); //parseInt() converts string into number
    }
    if (sum > 16) {
        return true;
    }
    return false;
}

function allEqualCheck(cardNum) {
    if (cardNum.split('').every(char => char === cardNum[0])) {
        return false;
    }
    return true;
}

/* using switch statement to final validation regarding to the requirements those checked seperately by previous inner functions*/
function isValidError() {
    if (cardNumLength === false) {
        errorArray.push('Number must be 16 digits!');
    }
    if (isNumOnly === false) {
        errorArray.push('Invalid characters!');
    }
    if (isLastDigitEven === false) {
        errorArray.push('Odd final number!');
    }
    if (isSumValid === false) {
        errorArray.push('Sum less than 16!');
    }
    if (allDigitsNotSame === false) {
        errorArray.push('All numbers can not be the same!');
    }
    return errorArray;
}
cardNumValidator('9999777788880000'); //valid number example
cardNumValidator('6666666666661666'); //valid number example

cardNumValidator('a92332119c011112'); //Invalid number example
cardNumValidator('4444444444444444'); //Invalid number example
cardNumValidator('1111111111111110'); //Invalid number example
cardNumValidator('6666666666666661'); //Invalid number example
0 голосов
/ 06 февраля 2020

В самой первой строке вы не передаете аргументы функции getLength.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...