Есть ли какая-то разница в коде? Один работает, а второй нет

Есть ли какая-то разница между ними? Вроде абсолютно одинаковые, но второй не работает. Подскажите, в чем причина?

Это первый код

function getNums(string) {
    return (string.split(/[\ \-\+\*\/]+/));
}

function getOperator(string) {
    let operatorIndex = string.search(/[-\+\*\/]/);
    return (string[operatorIndex]);
}

function calc(nums, operator) {
    nums.forEach(function(item) {
        if (item < 1 || item > 10) {
            throw new Error();
        }
    });
    switch (operator) {
        case '-':
            return (nums[0] - nums[1]);
        case '+':
            return (Number(nums[0]) + Number(nums[1]));
        case '*':
            return (nums[0] * nums[1]);
        case '/':
            return (nums[0] / nums[1]);
        default:
            throw new Error();
    }
}

function toArabic(roman) {
    roman = roman.toUpperCase();
    let lookup = {
            I: 1,
            V: 5,
            X: 10,
            L: 50,
            C: 100,
            D: 500,
            M: 1000
        },
        arabic = 0,
        i = roman.length;
    while (i--) {
        if (lookup[roman[i]] < lookup[roman[i + 1]]) 
        arabic -= lookup[roman[i]];
        else arabic += lookup[roman[i]];
    }
    return arabic;
}

function toRoman(num) {
    let lookup = {
            M: 1000,
            CM: 900,
            D: 500,
            CD: 400,
            C: 100,
            XC: 90,
            L: 50,
            XL: 40,
            X: 10,
            IX: 9,
            V: 5,
            IV: 4,
            I: 1
        },
        roman = '',
        i;
    for (i in lookup) {
        while (num >= lookup[i]) {
            roman += i;
            num -= lookup[i];
        }
    }
    return roman;
}

function calculator(string) {
    let nums = getNums(string);
    if (nums.length != 2) throw new Error();
    let operator = getOperator(string);
    let result;
    if (Number(nums[0]) && Number(nums[1])) {
        result = Math.floor(calc(nums, operator));
    } else
    if (!Number(nums[0]) && !Number(nums[1])) {
        let arabicNums = [toArabic(nums[0]), toArabic(nums[1])];
        result = toRoman(Number(calc(arabicNums, operator)));
    } else {
        throw new Error();
    }
    return (String(result));
}

Вот второй

function getNums(string) {
    return (string.split(/[\ \-\+\*\/]+/));
}

function getOperator(string) {
    let operatorIndex = string.search(/[-\+\*\/]/);
    return (string[operatorIndex]);
}

function calc(nums, operator) {
    nums.forEach(function(item) {
        if (item < 1 || item > 10) {
            throw new Error();
        }
    });
    switch (operator) {
        case '-':
            return (nums[0] - nums[1]);
        case '+':
            return (Number(nums[0]) + Number(nums[1]));
        case '/':
            return (nums[0] / nums[1]);
        case '*':
            return (nums[0] * nums[1]);
        default:
            throw new Error();
    }
}

function toArabic(roman) {
    roman = roman.toUpperCase();
    let lookup = {
            I: 1,
            V: 5,
            X: 10,
            L: 50,
            C: 100,
            D: 500,
            M: 1000
        },
        arabic = 0,
        i = roman.length;
    while (i--) {
        if (lookup[roman[1]] < lookup[roman[i + 1]]) 
        arabic -= lookup[roman[i]];
        else arabic += lookup[roman[i]];
    }
    return arabic;
}

function toRoman(num) {
    let lookup = {
            M: 1000,
            CM: 900,
            D: 500,
            CD: 400,
            C: 100,
            XC: 90,
            L: 50,
            XL: 40,
            X: 10,
            IX: 9,
            V: 5,
            IV: 4,
            I: 1
        },
        roman = '',
        i;
    for (i in lookup) {
        while (num >= lookup[i]) {
            roman += i;
            num -= lookup[i];
        }
    }
    return roman;
}

function calculator(string) {
    let nums = getNums(string);
    if (nums.length != 2) throw new Error();
    let operator = getOperator(string);
    let result;
    if (Number(nums[0]) && Number(nums[1])) {
        result = Math.floor(calc(nums, operator));
    } else
    if (!Number(nums[0]) && !Number(nums[1])) {
        let arabicNums = [toArabic(nums[0]), toArabic(nums[1])];
        result = toRoman(Number(calc(arabicNums, operator)));
    } else {
        throw new Error();
    }
    return (String(result));
}

Ответы (1 шт):

Автор решения: azlov

Код не нигде не изменен. Что я смог увидеть сразу, так это в функции function toArabic(roman) {} в первом случае:

if (lookup[roman[i]] < lookup[roman[i + 1]]) // сравнение с каждым i-тым

во втором:

 if (lookup[roman[1]] < lookup[roman[i + 1]]) // сравнение с первым
→ Ссылка