Задача JS

Apply Functions

Написать функцию applyFn, которая принимает на вход 2 параметра:

  • Массив с входными данными
  • Функцию, которую нужно применить к каждому элементу массива входных данных applyFn(dataArr, callback);

Функция должна возвращать объект в котором 2 массива массив результатов succeeded и массив ошибок errors с правильными call stacks

{
  succeeded: [...], // Массив данных после функции обработчика, как при вызове .map
  errors: [...],    // Массив инстансов ExecutionError
}

Создать класс ошибки ExecutionError с методом .getArgData(), по которому можно получить входные данные, на которых упала функция-коллбэк, то есть возвращать element входного массива dataArr, если вызов callback(element) сгенерирует ошибку

Стек трейс должен указывать на корректную позицию в функции-коллбэке Примечание: класс ExecutionError нужно сделать наследником другого класса
Пример:

const { succeeded, errors } = applyFn([1, 2, 3], (arg) => arg + 1);
//   succeeded: [2, 3, 4],
//   errors: [],

const dataArr = ['{"login":"login","password":"password"}', '{{}'];
const callback = JSON.parse;
const { succeeded, errors } = applyFn(dataArr, callback);
//   succeeded: [{ login: 'login', password: "password" }],
//   errors: [ExecutionError],
errors[0].getArgData(); // '{{}'

class ExecutionError {

}

function applyFn(dataArr, callback) {

}

Я не понимаю того как это должно работать. Пожалуйста, помогите разобраться, подтолкните, подскажите, если не трудно.

Описание задачи очень понятно, не понимаю какие у вас трудности 🤷‍♂️
Что конкретно Вам не понятно или Вы просто хотите чтобы за Вас её решили?

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

function applyFn(dataArr, callback) {

  let res = {

    succeeded: [],

    errors: [],

  };

  try {

    res.succeeded = dataArr.map(callback);

  } catch(e) {

  }

  

  return res

}

const { succeeded, errors } = applyFn([1, 2, 3], (arg) => arg + 1);

console.log(succeeded, errors)

  // succeeded: [2, 3, 4],

  // errors: [],

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

Отличное начало! Вам осталось завернуть выполнения коллбэка в try/catch, не вызов map и собирать соответствующие ошибки. Ещё бы посоветовал заменить map на reduce, так результаты вызовы коллбэка будет проще собирать

1 лайк

Спасибо за помощь! Наводка на reduce была очень к стати.
Итог :
class ExecutionError extends Error {

  constructor(element, name, stack, message){

      super(message);

      this.element = element

      this.name = name;

      this.stack = stack

  }

  getArgData() {

    return this.element

  }

}

function applyFn(dataArr, callback) {

  return dataArr.reduce(function(acc, currentElement, i) {

    const {succeeded, errors} = acc;

    try {

      succeeded.push(callback(currentElement))

    } catch(e) {

      errors.push(new ExecutionError(dataArr[i], e.name, e.stack));

    }

    return acc

  }, {

    succeeded: [],

    errors: [],

  })

}
3 лайка