JavaScript: создать функцию, которая возвращает функцию, которая возвращает либо значение, либо объект на основе входного параметра - PullRequest
1 голос
/ 12 июня 2019

Я хочу:

Создайте функцию saveOutput, которая принимает функцию (которая будет принимать один аргумент) и строку (которая будет действовать как пароль). Затем saveOutput возвращает функцию, которая ведет себя точно так же, как переданная функция, за исключением случаев, когда строка пароля передается в качестве аргумента. Когда это происходит, возвращаемая функция возвращает объект со всеми ранее переданными аргументами в качестве ключей, а соответствующие выходные данные в виде значений

Я попробовал следующий код ниже:

const saveOutput = (inputFunc, str) => {

  let newObj = {}; 

  return function (value) {

    if (value === str){

      return newObj[value] = inputFunc(value)
    }
    // return a function that behaves exactly like the passed-in function
    else {
      return inputFunc(value)
    }
  }
}

// Uncomment these to check your work!
const multiplyBy2 = function(num) { return num * 2; };

const multBy2AndLog = saveOutput(multiplyBy2, 'boo');

console.log(multBy2AndLog(2)); // should log: 4
console.log(multBy2AndLog(9)); // should log: 18
console.log(multBy2AndLog('boo')); // should log: { 2: 4, 9: 18 }

Мой код возвращает:

console.log(multBy2AndLog(2)); // returns 4
    console.log(multBy2AndLog(9)); // returns 18
    console.log(multBy2AndLog('boo')); // returns NaN

Почему мой третий и последний файл console.log возвращает NaN, если он должен вернуть:

{ 2: 4, 9: 18 }

1 Ответ

1 голос
/ 12 июня 2019

Вы должны переместить присвоение newObj в предложение else и вернуть newObj, когда value === str:

if (value === str){     
   return newObj;
}
// return a function that behaves exactly like the passed-in function
else {
   newObj[value] = inputFunc(value);
   return inputFunc(value);
}

Живой пример:

const saveOutput = (inputFunc, str) => {

  let newObj = {}; 

  return function (value) {

    if (value === str){     
      return newObj;
    }
    // return a function that behaves exactly like the passed-in function
    else {
      newObj[value] = inputFunc(value);
      return inputFunc(value)
    }
  }
}

// Uncomment these to check your work!
const multiplyBy2 = function(num) { return num * 2; };

const multBy2AndLog = saveOutput(multiplyBy2, 'boo');

console.log(multBy2AndLog(2)); // should log: 4
console.log(multBy2AndLog(9)); // should log: 18
console.log(multBy2AndLog('boo')); // should log: { 2: 4, 9: 18 }
...