Sobes.tech
Назад к вопросам
Middle+
3

Реализуйте функцию mapper, которая принимает данные (source), поля (fields), фильтр (filter) и сортировку (order). Необходимо: валидировать параметры (fields должен быть массивом, source/filter/order — функциями, поля из fields должны присутствовать в данных), получить данные через вызов source(), отфильтровать через filter, отсортировать через order и вернуть только запрошенные поля из fields.

Компании, где спрашивали
КасперскийКасперский

Ответ от нейросети

sobes.tech AI

javascript function mapper({ source, fields, filter, order }) { // Валидация параметров if (!Array.isArray(fields)) { throw new TypeError('fields должен быть массивом'); } if (typeof source !== 'function') { throw new TypeError('source должен быть функцией'); } if (typeof filter !== 'function') { throw new TypeError('filter должен быть функцией'); } if (typeof order !== 'function') { throw new TypeError('order должен быть функцией'); }

const data = source();

if (!Array.isArray(data)) { throw new TypeError('source должен возвращать массив объектов'); }

// Проверка, что все поля из fields есть в данных for (const field of fields) { if (!data.every(item => field in item)) { throw new Error(Поле '${field}' отсутствует в данных); } }

// Фильтрация const filtered = data.filter(filter);

// Сортировка const sorted = filtered.sort(order);

// Выбор только нужных полей return sorted.map(item => { const result = {}; for (const field of fields) { result[field] = item[field]; } return result; }); }


Пример использования:

```javascript
const source = () => [
  { id: 1, name: 'Alice', age: 30 },
  { id: 2, name: 'Bob', age: 25 },
  { id: 3, name: 'Charlie', age: 35 }
];

const fields = ['id', 'name'];
const filter = item => item.age >= 30;
const order = (a, b) => a.name.localeCompare(b.name);

const result = mapper({ source, fields, filter, order });
console.log(result);
// [{ id: 1, name: 'Alice' }, { id: 3, name: 'Charlie' }]