Sobes.tech
Middle+

Υλοποιήστε μια λειτουργία mapper που δέχεται δεδομένα (source), πεδία (fields), φίλτρο (filter) και ταξινόμηση (order). Είναι απαραίτητο: να επικυρώσετε τις παραμέτρους (fields πρέπει να είναι πίνακας, source/filter/order είναι συναρτήσεις, τα πεδία στο fields πρέπει να υπάρχουν στα δεδομένα), να λάβετε τα δεδομένα μέσω της κλήσης source(), να φιλτράρετε μέσω filter, να ταξινομήσετε μέσω order και να επιστρέψετε μόνο τα ζητούμενα πεδία από τα fields.

sobes.tech AI

Απάντηση από 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' }]