Как использовать функцию карты и функцию стрелки внутри другой функции? - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь получить максимальную частоту сердечных сокращений за несколько лет, реализовав несколько функций Функция arrayCalc использует цикл for для пустого массива с именем "arrRes", чтобы выдвинуть новое значение. В то же время функция calcAge рассчитывает возраст человека по текущему году. Вместо цикла for я хочу использовать функции .map и arrow внутри функции arrayCalc, которой переданы некоторые аргументы. Я не знаю, куда идти по этому поводу.

Я пытался использовать такие ресурсы, как веб-документ MDN, чтобы уточнить, что такое карта и стрелки. Как только я узнал его синтаксис и его реализацию, я начал оборачивать .map и функцию стрелки в постоянную переменную с именем "arrRes". По сути, я пытаюсь воспроизвести тот же результат, что и в «старом» arrayCalc.

const years = [1990, 1965, 1937, 2005, 1998];

// The function I'm trying to replicate

function arrayCalc(arr, fn) {
  const arrRes = [];
  for (let i = 0; i < arr.length; i++) {
    arrRes.push(fn(arr[i]));
  }
  return arrRes;
}

// My attempt to shorten the arrayCalc function using .map and the arrow

/* function arrayCalc(arr, fn){
  const arrRes = arr.map(arry => arry);
} */


function calcAge(ex) {
  return new Date().getFullYear() - ex;
}

function maxHeartRate(ex) {
  const result_2 = Math.round(206.9 - (0.67 * ex))
  return (ex >= 18 && ex <= 81 ? result_2 : -1)
}

const ages = arrayCalc(years, calcAge);
const heartRate = arrayCalc(ages, maxHeartRate);

console.log(ages);
console.log(heartRate);

Мой вывод должен быть // [29, 54, 82, 14, 21]. Но консоль выдает мне ошибку «Uncaught TypeError: Невозможно прочитать свойство 'map' of undefined". Очевидно, что код, который я пытаюсь реализовать, закомментирован для получения результата. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 10 мая 2019

Вы можете взять функцию в качестве параметра для отображения.

function arrayCalc(arr, fn) {
    return arr.map(fn);
}

const years = [1990, 1965, 1937, 2005, 1998];

function arrayCalc(arr, fn) {
    return arr.map(fn);
}

function calcAge(ex) {
  return new Date().getFullYear() - ex;
}

function maxHeartRate(ex) {
  const result_2 = Math.round(206.9 - (0.67 * ex))
  return (ex >= 18 && ex <= 81 ? result_2 : -1)
}

const ages = arrayCalc(years, calcAge);
const heartRate = arrayCalc(ages, maxHeartRate);

console.log(ages);
console.log(heartRate);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Или принять более короткий подход, используя Array#map напрямую с обратным вызовом.

function calcAge(ex) {
    return new Date().getFullYear() - ex;
}

function maxHeartRate(ex) {
    const result_2 = Math.round(206.9 - (0.67 * ex))
    return ex >= 18 && ex <= 81 ? result_2 : -1;
}

const years = [1990, 1965, 1937, 2005, 1998];
const ages = years.map(calcAge);
const heartRate = ages.map(maxHeartRate);

console.log(ages);
console.log(heartRate);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 10 мая 2019

Вам не хватает вернуть значение из вашей функции, а также вы должны вернуть значение из выполнения функции fn, а не arr:

function arrayCalc(arr, fn){
  const arrRes = arr.map(a => fn(a)); // and not .map(arr => arr)
  return arrRes; // missing return statement
}

Рабочий пример :

const years = [1990, 1965, 1937, 2005, 1998];

// The function I'm trying to replicate

/*function arrayCalc(arr, fn) {
  const arrRes = [];
  for (let i = 0; i < arr.length; i++) {
    arrRes.push(fn(arr[i]));
  }
  return arrRes;
}*/

// My attempt to shorten the arrayCalc function using .map and the arrow

function arrayCalc(arr, fn){
  const arrRes = arr.map(a => fn(a));
  return arrRes;
  // OR
  // return arr.map(fn);
}


function calcAge(ex) {
  return new Date().getFullYear() - ex;
}

function maxHeartRate(ex) {
  const result_2 = Math.round(206.9 - (0.67 * ex))
  return (ex >= 18 && ex <= 81 ? result_2 : -1)
}

const ages = arrayCalc(years, calcAge);
const heartRate = arrayCalc(ages, maxHeartRate);

console.log(ages);
console.log(heartRate);
...