Тернарный оператор не возвращает неопределенный - PullRequest
1 голос
/ 02 мая 2020

Я работаю над промежуточным алгоритмом F CC «Аргументы необязательны». Вот инструкции о том, что должно произойти:

Скриптинг промежуточного алгоритма: Аргументы Необязательно

  1. Создайте функцию, которая суммирует два аргумента вместе. Если указан только один аргумент, вернуть функцию, которая ожидает один аргумент и возвращает сумму.
  2. Например, addTogether (2, 3) должна вернуть 5, а addTogether (2) должна вернуть функцию.
  3. Вызов этой возвращенной функции с одним аргументом вернет сумму: var sumTwoAnd = addTogether (2); sumTwoAnd (3) возвращает 5.
  4. Если какой-либо аргумент не является допустимым числом, вернуть неопределенное значение.

Я написал код, чтобы сделать все, как описано выше, но одно требование заключается в том, что все аргументы должны быть числами, в противном случае вернуть undefined (# 4 выше). Вы увидите, что я написал переменную троичного оператора (строка 5 моего кода) numbersOnly, которая, я думал, справится с этим, но она просто возвращает [Function] в консоли.

function addTogether() {
    // Convert args to an array
    let args = [...arguments];
    // Only accept numbers or return undefined and stop the program
    const numbersOnly = value => typeof(value) === 'number'? value : undefined;
    // test args for numbersOnly and return only the first two arguments regardless of the length of args
    let numbers = args.filter(numbersOnly).slice(0, 2);

    // // It has to add two numbers passed as parameters and return the sum.
    if (numbers.length > 1) {
        return numbers[0] + numbers[1];
    }
    // If it has only one argument then it has to return a function that uses that number and expects another one, to then add it.
    else if (numbers.length === 1) {
        let firstParam = numbers[0];
        return function(secondParam) {
            if (typeof secondParam !== 'number' || typeof firstParam !== 'number') {
                return undefined;
            }
            return secondParam + firstParam;
        }
    }
}

Я прохожу все тесты, кроме # 4, который должен вернуть undefined. Я не совсем понимаю, почему 5 проходит и возвращает неопределенное значение, но 4 не удается. Что мне здесь не хватает? Спасибо!

1. addTogether(2, 3) should return 5.
2. addTogether(2)(3) should return 5.
3. addTogether("https://www.youtube.com/watch?v=dQw4w9WgXcQ") should return undefined.
4. addTogether(2, "3") should return undefined.
5. addTogether(2)([3]) should return undefined.

Ответы [ 2 ]

1 голос
/ 02 мая 2020

Это потому, что вы должны проверять входные и выходные аргументы из фильтра. Попробуйте добавить этот фрагмент:

let numbers = args.filter(numbersOnly).slice(0, 2);
if (args.length > numbers.length) {
  return undefined;
}

function addTogether() {
    // Convert args to an array
    let args = [...arguments];
    // Only accept numbers or return undefined and stop the program
    const numbersOnly = value => typeof(value) === 'number'? value : undefined;
    // test args for numbersOnly and return only the first two arguments regardless of the length of args
    let numbers = args.filter(numbersOnly).slice(0, 2);
    if (args.length > numbers.length) {
      return undefined;
    }

    // // It has to add two numbers passed as parameters and return the sum.
    if (numbers.length > 1) {
        return numbers[0] + numbers[1];
    }
    // If it has only one argument then it has to return a function that uses that number and expects another one, to then add it.
    else if (numbers.length === 1) {
        let firstParam = numbers[0];
        return function(secondParam) {
            if (typeof secondParam !== 'number' || typeof firstParam !== 'number') {
                return undefined;
            }
            return secondParam + firstParam;
        }
    }
  }
  console.log('4. addTogether', addTogether(4, "4"));
0 голосов
/ 02 мая 2020

Поскольку при фильтрации аргументов отфильтровывается только '3', длина оставшегося массива равна 1.

const args = [2, '3'];
const numbers = args.filter((n) => typeof n === 'number');
console.log('numbers:', numbers);
console.log('numbers.length === 1:', numbers.length === 1);
...