8

Как преобразовать массив в объект?

1

Заголовок: Как преобразовать массив в объект с индексами в JavaScript?

Описание проблемы:

Мне нужно преобразовать массив, содержащий строки, в объект, где ключами будут индексы этих строк, а значениями — сами строки.

Например, я имею массив:

['a', 'b', 'c']

и хочу получить следующий объект:

{
  0: 'a',
  1: 'b',
  2: 'c'
}

Какое самое эффективное решение для этой задачи? Заранее спасибо за помощь!

5 ответ(ов)

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().

1

Если вы используете 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'}.

0

Для полноты информации, распространение (spreading) в ECMAScript 2015 (ES6) требует либо транспайлера (например, Babel), либо окружения, поддерживающего как минимум ES6.

Пример кода:

console.log(
   { ...['a', 'b', 'c'] }
)

В данном примере использование оператора распространения { ...['a', 'b', 'c'] } приведёт к созданию объекта, где ключами будут индексы массива, а значениями — сами элементы массива. Результатом выполнения будет следующее:

{ '0': 'a', '1': 'b', '2': 'c' }

Имейте в виду, что для использования этой функциональности необходимо, чтобы ваш JavaScript-движок поддерживал ES6. Если вы работаете в среде, где поддержка отсутствует, вам потребуется использовать Babel для транспиляции кода в более старую версию JavaScript.

0

Если вы хотите использовать одно из свойств объектов в массиве в качестве ключа, вы можете сделать это с помощью метода 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 является пустой объект {}.

В итоге у вас получится объект с нужной структурой.

0

Я бы, вероятно, записал это так (так как очень редко у меня нет библиотеки 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. Обратите внимание, что индексы массива становятся ключами объекта.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь