Напишите код, который сделает из массива объект
Дан массив объектов:
const arr = [
{ name: "width", value: 10 },
{ name: "height", value: 20 },
];
Необходимо сделать из массива объект.
Примеры:
mapArrInObj([
{ name: "width", value: 10 },
{ name: "height", value: 20 }
]) --> { width: 10, height: 20 }
mapArrInObj([
{ name: "x", value: 100 },
{ name: "y", value: 200 }
]) --> { x: 100, y: 200 }
mapArrInObj([
{ name: "size", value: 0 },
{ name: "weight", value: 10 }
]) --> { size: 0, weight: 10 }
Теория по задаче
Преобразование «массив → объект» означает, что множество элементов объединяется в одну структуру, где доступ к данным идёт по ключу. В этой задаче каждый элемент массива описывает одно свойство: name — имя свойства, value — значение свойства. Поэтому базовая операция выглядит как присваивание по вычисляемому ключу: result[name] = value.
Почему работает Object.fromEntries
Object.fromEntries() создаёт объект из набора пар вида [ключ, значение]. Поэтому задача удобно решается через промежуточное представление в виде пар.
// 1) Преобразование элемента в пару:
{ name: "width", value: 10 } -> ["width", 10]
// 2) Сборка объекта из пар:
[ ["width", 10], ["height", 20] ] -> { width: 10, height: 20 }</code></pre>
Схема потока данных:
<pre><code>[ {name, value}, {name, value}, ... ]
|
| map: ({name,value}) => [name,value]
v
[ [name, value], [name, value], ... ]
|
| Object.fromEntries
v
{ [name]: value, [name]: value, ... }
Почему работает reduce
reduce() «сворачивает» массив к одному результату. В качестве результата удобно выбрать объект, а затем постепенно добавлять в него свойства.
Мини-схема итераций:
acc = {}
элемент 1: acc[name1] = value1 -> acc = { name1: value1 }
элемент 2: acc[name2] = value2 -> acc = { name1: value1, name2: value2 }
...
Важно понимать роль initialValue: когда оно равно {}, аккумулятор с первой итерации является объектом результата.
Как выбрать подход
Выбор обычно зависит от читаемости и необходимости дополнительных проверок.
| Подход | Короткость кода | Читаемость новичку | Удобство проверок |
|---|---|---|---|
Object.fromEntries + map | Высокая | Средняя | Средняя |
reduce | Средняя | Средняя | Высокая |
for...of | Низкая/средняя | Высокая | Высокая |
Object.create(null) | Средняя | Средняя | Высокая |
Крайние случаи и типичные ошибки
- Повтор ключей (
nameодинаковый): будет перезапись, поэтому сохранится значение из последнего элемента с такимname. - Пустой массив: корректным результатом является пустой объект
{}. - Значения
0,false,"",null: это допустимые значения, они должны сохраняться без попыток «отфильтровать пустое». - Неожиданная форма элементов: если элемент без
nameилиnameне строка, уместно выбрасыватьTypeError, чтобы ошибка обнаруживалась рядом с источником данных.
if (value) для этой задачи является типичной ошибкой, потому что 0 и "" являются корректными значениями, но считаются «ложными» в условиях.Кратко: задача решается созданием объекта, где ключом становится name, а значением — value; удобные реализации: Object.fromEntries(arr.map(...)), arr.reduce(..., {}) или цикл for...of. Для надёжности полезно помнить про перезапись при одинаковых ключах и не отбрасывать значения вроде 0.