Как сделать, чтобы обратный вызов без возвращаемого значения работал в функции более высокого порядка - PullRequest
0 голосов
/ 25 апреля 2018

Код, который я публикую, работает, но он не следует указаниям моего приглашения, которое гласит:

"Создать функцию forEach, которая принимает массив и обратный вызов и выполняет обратный вызов накаждый элемент массива. forEach ничего не возвращает. Пожалуйста, не используйте собственный метод forEach или map. "

- он говорит, что ничего не возвращает в forEach.Я только смог заставить его работать с возвращением.Может кто-нибудь помочь мне понять, как не использовать функцию return on forEach при сохранении функциональности?

// Challenge 1
function subtractTwo(num) {
    return num - 2;  
}

function map(array, callback) {
    var newArray = [];
  for (var i = 0; i < array.length; i++) {
    newArray.push(callback(array[i]));
  }
  return newArray;
}

console.log(map([3, 4, 5], subtractTwo));


// Challenge 2
function forEach(array, callback) {
    var newArray = []
  for (var i = 0; i < array.length; i++) {
    newArray.push(callback(array[i]));
  }
  return newArray
}

// Challenge 3
function mapWith(array, callback) {
    var newArray = [];
  return forEach(array, callback);
}
console.log(mapWith([3, 4, 5], subtractTwo));

Вот третье приглашение к вызову

Теперь давайте восстановим карту из вызова 1 какКартаЧто.На этот раз вместо цикла for вы будете использовать функцию forEach, созданную в вызове 2.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

За это приглашение вы почти у цели, но слишком много делаете.Вам нужно сделать только то, что говорит подсказка, выполнить обратный вызов для каждого элемента и ничего больше.Не пытайтесь использовать результат обратного вызова и не создавайте новый массив.

Так что реализация второй задачи может выглядеть следующим образом:

// Challenge 2
function forEach(array, callback) {
  // Just run the callback for each element. Do not save the results
  // anywhere, do not return anything.
  for (var i = 0; i < array.length; i++) {
    callback(array[i]);
  }
}

Использование этогоforEach, вам придется немного изменить функцию mapWith, чтобы работать с ней.В mapWith вместо передачи обратного вызова непосредственно в forEach, оберните его внутри другой функции, где вы можете захватить результат из исходного обратного вызова и вставить его в новый массив.

Так что-то вроде:

// Challenge 3
function mapWith(array, callback) {
    var newArray = [];

    // Recall that forEach does not return anything, so you don't
    // want your return statement here. Instead, wrap the orignal
    // callback so that you can take each result and put it into
    // your "newArray" variable.
    forEach(array, function(element) {
       // Push the result of original callback into the new array:
       newArray.push(callback(element))
    });

    // Make sure to return this mapped array.
    return newArray;
}
0 голосов
/ 25 апреля 2018

Язык приглашения здесь очень важен:

Создайте функцию forEach, которая принимает массив и обратный вызов, и запускает обратный вызов для каждого элемента массива.forEach ничего не возвращает .

Он просит вас вызвать функцию для каждого элемента массива, но не просит вернуть массив.В отличие от map, forEach только вызывает предоставленный обратный вызов для каждого элемента, но не возвращает массив.

Из MDN : «Метод forEach () выполняет предоставленную функциюодин раз для каждого элемента массива. "Например, рассмотрим этот код, используя собственный forEach:

var foo = [1, 2, 3];

function logger(item) {
  console.log(item);
}

foo.forEach(logger);

>1
>2
>3

Кроме того, если мы попытаемся зарегистрировать то, что возвращается из forEach, мы получим следующее:

console.log(foo.forEach(logger));
>1
>2
>3
>undefined // The returned value

Вашреализация близка, но, похоже, вы пытались включить функциональность map (возвращая новый массив) в вашу функцию forEach.Вам нужно изменить его так, чтобы он вызывал функцию только для каждого элемента, но не создавал и не возвращал новый массив.

Чтобы создать функцию mapWith, вам может понадобиться промежуточная функция, котораяобрабатывает создание нового массива, но он будет отделен от callback и forEach.

...