Функция обратного вызова не выполняется - PullRequest
0 голосов
/ 02 июля 2018

Возвращаемый массив должен быть [1,2,3], но вместо этого [3,4,5] регистрируется на консоли. Может кто-нибудь объяснить мне, почему?

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

function map(array, callback) {
  forEach(array, callback)
  return array
}

console.log(map([3, 4, 5], n => n - 2));

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

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

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

function map(array, callback) {
  forEach(array, callback);
  return array;
}

console.log(map([3, 4, 5], n => n - 2));

Если map() не должен изменять его аргумент, вы можете сделать копию массива перед вызовом forEach().

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

function map(array, callback) {
  array = array.slice();
  forEach(array, callback);
  return array;
}

var testArray = [3, 4, 5];
console.log(map(testArray, n => n - 2));
console.log(testArray);
0 голосов
/ 02 июля 2018

Функция обратного вызова не выполняется

Да, это так, вам просто нужно правильно вернуть новый массив

Фрагмент стека

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

function map(array, callback) {
  return forEach(array, callback);      // changed
}
console.log(map([3, 4, 5], n => n - 2));

Или глубоко клонировать array и очистить его, как это

function forEach(array, callback) {
  var newA = JSON.parse(JSON.stringify(array));    // deep clone
  array.length = 0;                                // clear the array
  for (var i = 0; i < newA.length; i++) {
    array.push(callback(newA[i]));
  }
}

function map(array, callback) {
  forEach(array, callback);
  return array
}
console.log(map([3, 4, 5], n => n - 2));

или это

function forEach(array, callback) {
  var newA = array.slice();                        // shallow copy
  array.length = 0;                                // clear the array
  for (var i = 0; i < newA.length; i++) {
    array.push(callback(newA[i]));
  }
}

function map(array, callback) {
  forEach(array, callback);
  return array
}
console.log(map([3, 4, 5], n => n - 2));
...