Sobes.tech
Middle+

Implementeer een mapper-functie die gegevens (source), velden (fields), filter (filter) en sortering (order) accepteert. Het is noodzakelijk: de parameters te valideren (fields moet een array zijn, source/filter/order zijn functies, de velden in fields moeten aanwezig zijn in de gegevens), de gegevens op te halen via source(), te filteren via filter, te sorteren via order en alleen de gevraagde velden uit fields terug te geven.

sobes.tech AI

Antwoord van 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' }]