Реализация _forEach в JS, возвращающая undefined - PullRequest
2 голосов
/ 13 июля 2020

Edit: на самом деле, как указывали другие пользователи, реализация _map, поскольку _forEach не предназначен для возврата копии массива.

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

function _forEach(arr, cb) {
  var storage = [];
  for (let i = 0; i < arr.length; i++) {
    storage.push(cb(arr[i], i, arr));
  }
  return storage;
}
var list = ["hay", "lal", "pay"];
list = _forEach(list, function(name, i, list) {
  name.replace("a", "");
});

console.log(list);

Насколько я понимаю, storage.push(cb(arr[i], i, arr)) должен хранить возвращаемое значение из обратного вызова в новый массив, а затем return storage должен иметь копию измененного массива.

Но результат console.log (list) после вызова будет просто [undefined, undefined, undefined]. Однако, если я добавлю console.log(name.replace('a', '')) в обратный вызов, я вижу, что фильтр применяется правильно. Так почему же он не сохраняет измененный элемент в новом массиве?

Ответы [ 3 ]

1 голос
/ 13 июля 2020

Вам необходимо добавить возвращаемое значение функции обратного вызова, как показано ниже.

function _forEach(arr, cb) {
 
  var storage = [];
  for (let i = 0; i < arr.length; i++) {
    storage.push(cb(arr[i], i, arr));
  }
  return storage;
}
var list = ["hay", "lal", "pay"];
list = _forEach(list, function(name, i, list) {
  return name.replace("a", "");
});

console.log(list);
1 голос
/ 13 июля 2020

Иногда также важен глоссарий, вы используете (реализуете) forEach и ожидаете, что он будет вести себя как карта.

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

Array#map соответствует тому, что мы ожидаем, сопоставить элементы от A до B и накопить их в новый массив (Functor f => (a → b) → f a → f b).

const original = ["hay", "lal", "pay"];

const withoutA = original.map(
  (word) => word.replace(/a/gi, ''),
);

console.log(
  'original without "a"',
  withoutA
);
1 голос
/ 13 июля 2020
  1. Вы делаете что-то вроде map, а не forEach. Проверьте Array.prototype.map для получения дополнительной информации.

  2. Ваш обратный вызов не имеет возвращаемого значения, поэтому он всегда будет undefined.

list = _forEach(list, function(name, i, list) {
  name.replace("a", "");
});

преобразовать его в

list = _forEach(list, function(name, i, list) {
  return name.replace("a", "");
});
...