Как преобразовать массив в объект?
Заголовок: Как преобразовать массив в объект с индексами в JavaScript?
Описание проблемы:
Мне нужно преобразовать массив, содержащий строки, в объект, где ключами будут индексы этих строк, а значениями — сами строки.
Например, я имею массив:
['a', 'b', 'c']
и хочу получить следующий объект:
{
0: 'a',
1: 'b',
2: 'c'
}
Какое самое эффективное решение для этой задачи? Заранее спасибо за помощь!
5 ответ(ов)
На ваш вопрос можно ответить так:
Если у вас есть функция, которая преобразует массив в объект, как показано ниже:
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
rv[i] = arr[i];
return rv;
}
То стоит отметить, что массив по сути уже является объектом, но массивы имеют некоторые «интересные» и особые особенности в отношении свойств с целочисленными именами. В приведённом примере вы получите обычный объект.
Также следует учесть возможные «пробелы» в массиве. Вы можете модифицировать исходную функцию следующим образом:
function toObject(arr) {
var rv = {};
for (var i = 0; i < arr.length; ++i)
if (arr[i] !== undefined) rv[i] = arr[i];
return rv;
}
В современных JavaScript-средах вы можете использовать метод .reduce()
:
var obj = arr.reduce(function(acc, cur, i) {
acc[i] = cur;
return acc;
}, {});
Этот подход также избегает «пробелов» в массиве, поскольку именно так работает метод .reduce()
.
Если вы используете jQuery и хотите использовать функцию $.extend()
, то нужно знать, что она предназначена для объединения объектов. Однако в вашем примере вы пытаетесь передать массив в качестве второго аргумента, что не совсем корректно, так как $.extend()
ожидает, что второй аргумент будет объектом.
Вот как можно исправить ваш код:
$.extend({}, { first: 'a', second: 'b', third: 'c' });
В этом примере мы передали объект с ключами и значениями вместо массива. Если вам нужно объединить массив и хотите получить, например, объект с индексами массива в качестве ключей, можно сделать так:
let array = ['a', 'b', 'c'];
let result = $.extend({}, array);
console.log(result);
Это создаст объект result
, где ключами будут индексы массива, а значениями — соответствующие элементы, т.е. {'0': 'a', '1': 'b', '2': 'c'}
.
Для полноты информации, распространение (spreading) в ECMAScript 2015 (ES6) требует либо транспайлера (например, Babel), либо окружения, поддерживающего как минимум ES6.
Пример кода:
console.log(
{ ...['a', 'b', 'c'] }
)
В данном примере использование оператора распространения { ...['a', 'b', 'c'] }
приведёт к созданию объекта, где ключами будут индексы массива, а значениями — сами элементы массива. Результатом выполнения будет следующее:
{ '0': 'a', '1': 'b', '2': 'c' }
Имейте в виду, что для использования этой функциональности необходимо, чтобы ваш JavaScript-движок поддерживал ES6. Если вы работаете в среде, где поддержка отсутствует, вам потребуется использовать Babel для транспиляции кода в более старую версию JavaScript.
Если вы хотите использовать одно из свойств объектов в массиве в качестве ключа, вы можете сделать это с помощью метода reduce
. Например, в вашем случае у вас есть массив объектов, и вы хотите преобразовать его в объект, где ключом будет значение свойства sid
.
Исходный массив выглядит так:
const arr = [
{
sid: 123,
name: 'aaa'
},
{
sid: 456,
name: 'bbb'
},
{
sid: 789,
name: 'ccc'
}
];
А результатом будет объект:
{
'123': { sid: 123, name: 'aaa' },
'456': { sid: 456, name: 'bbb' },
'789': { sid: 789, name: 'ccc' }
}
Чтобы добиться этого, вы можете использовать следующий код:
const result = arr.reduce((obj, cur) => ({...obj, [cur.sid]: cur}), {});
Здесь метод reduce
перебирает каждый элемент массива arr
. На каждой итерации он создает новый объект, используя оператор расширения (...
) для копирования свойств предыдущего объекта (obj
) и добавления нового свойства, где ключом будет cur.sid
, а значением — текущий объект cur
. Начальным значением для аккумулятора obj
является пустой объект {}
.
В итоге у вас получится объект с нужной структурой.
Я бы, вероятно, записал это так (так как очень редко у меня нет библиотеки underscore.js под рукой):
var _ = require('underscore');
var a = ['a', 'b', 'c'];
var obj = _.extend({}, a);
console.log(obj);
// выводит { '0': 'a', '1': 'b', '2': 'c' }
В этом примере мы используем метод _.extend()
из библиотеки Underscore для копирования значений из массива a
в новый объект obj
. Обратите внимание, что индексы массива становятся ключами объекта.
Проверка наличия ключа в объекте JavaScript?
Как получить доступ к вложенным объектам, массивам или JSON и обработать их?
Как удалить все дубликаты из массива объектов?
Самый эффективный способ группировки массивов объектов
Наиболее эффективный способ преобразовать HTMLCollection в массив