Какой лучший способ конвертировать:
['a','b','c']
чтобы:
{
0: 'a',
1: 'b',
2: 'c'
}
javascript
arrays
node.js
object
Дэвид Хеллсинг
источник
источник
_.keyBy
(ранее_.indexBy
): lodash.com/docs#keyBy_.toPlainObject
. Пример:var myObj = _.toPlainObject(myArr)
Ответы:
ECMAScript 6 представляет легко заполняемый файл
Object.assign
:Собственный
length
свойство массива не копируется, поскольку оно не перечисляемо.Кроме того, вы можете использовать синтаксис ES6 для достижения того же результата:
источник
{ ...[sortedArray]}
С такой функцией:
Ваш массив уже более или менее просто объект, но массивы действительно имеют некоторое «интересное» и особое поведение по отношению к целочисленным свойствам. Вышесказанное даст вам простой объект.
отредактируйте также, возможно, вы захотите учесть "дыры" в массиве:
В современных средах исполнения JavaScript вы можете использовать
.reduce()
метод:Этот также позволяет избежать «дыр» в массиве, потому что так оно и
.reduce()
работает.источник
[]
), если вы не собираетесь использовать числовые ключи свойств и свойство "length".const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Вы можете использовать аккумулятор ака
reduce
.Передайте пустой объект
{}
в качестве отправной точки; затем «увеличивать» этот объект постепенно. В конце итерацийresult
будет{"0": "a", "1": "b", "2": "c"}
Если ваш массив представляет собой набор объектов пары ключ-значение:
будет производить:
{a: 1, b: 2, c: 3}
Для полноты картины
reduceRight
позволяет перебирать массив в обратном порядке:будет производить:
{c:3, b:2, a:1}
Ваш аккумулятор может быть любого типа для конкретной цели. Например, чтобы поменять ключ и значение вашего объекта в массиве, передайте
[]
:будет производить:
[{1: "a"}, {2: "b"}, {3: "c"}]
В отличие от
map
,reduce
не может использоваться в качестве 1-1 отображения. У вас есть полный контроль над элементами, которые вы хотите включить или исключить. Поэтомуreduce
позволяет добиться тогоfilter
, что делает, что делаетreduce
очень универсальным:будет производить:
[{2: "b"}, {3: "c"}]
Осторожно :
reduce
иObject.key
являются частьюECMA 5th edition
; Вы должны предоставить polyfill для браузеров, которые их не поддерживают (особенно IE8).Смотрите реализацию по умолчанию от Mozilla .
источник
Если вы используете jquery:
источник
{0: 'a', 1: 'b', 2: 'c'}
то, что является ожидаемым результатом.Для полноты распространения ECMAScript 2015 (ES6). Потребуется либо транспортер (Babel), либо среда, работающая как минимум на ES6.
источник
Вероятно, я бы написал так (поскольку очень редко у меня не будет библиотеки underscorejs):
источник
obj=_.extend({},a);
сделает эту работу. Кроме того, если вы перебираете массивы, я бы сказал,_.each
что это более уместно, чем_.map
. В общем, это не очень хороший ответ на нескольких уровнях.Вот метод O (1) ES2015 только для полноты.
источник
length
имущество. (3) Объект все еще является массивомArray.isArray(arr) === true
. (4) Специальные поведения массива не удаляются, например,arr.length = 0
удаляются все индексы. (5) Поэтому я думаю, чтоObject.assign
намного лучше .Array.isArray
возвращаетсяtrue
за "объект" здесь, хотяinstanceof Array
не ...Удивлен не видеть -
источник
{ "first":"a", "second":"b","third":"c" }
с исправлением ключей - я ищу деструктивмы можем использовать
Object.assign
иarray.reduce
функцию для преобразования массива в объект.источник
В итоге я использовал оператор распространения объектов, поскольку он является частью стандарта ECMAScript 2015 (ES6).
Сделал следующую скрипку в качестве примера.
источник
В современном JavaScript простой способ - использовать
Object.assign()
только копирование ключа: значения из одного объекта в другой. В нашем случаеArray
жертвует свойства на новый{}
.источник
O.assign
но это не объяснялось. В настоящее время деструктурирование массива в объект является способом ({...array}
)Для ES2016, оператор распространения для объектов. Примечание: это после ES6 и поэтому необходимо настроить транспортер.
источник
Пять лет спустя, есть хороший способ :)
Object.assign
был представлен в ECMAScript 2015.источник
Используя
javascript#forEach
один можно сделать этоС ECMA6:
источник
FWIW, еще один недавний подход заключается в использовании нового
Object.fromEntries
наряду соObject.entries
следующим:... что позволяет избежать хранения разреженных элементов массива как
undefined
илиnull
и сохраняет неиндексные (например, не положительно-целые / не числовые) ключи.arr.length
Тем не менее, можно добавить , что это не входит:источник
Вы можете использовать спред оператора
источник
Если вы используете ES6, вы можете использовать Object.assign и оператор распространения
Если у вас есть вложенный массив, как
источник
new Map([['key1', 'value1'], ['key2', 'value2']]);
Быстрый и грязный:
источник
{0:"c", 1:"b", 2:"a"}
. Вы или хотитеunshift
вместоpop
или (лучше) начать сi=arr.length-1
и уменьшить вместо.l = arr.length
и потомwhile (l && (obj[--l] = arr.pop())){}
(я понимаю, что это старо, но почему бы не упростить его еще дальше).Быстро и грязно # 2:
источник
i < a.length
вместоa[i]
.Начиная с Lodash 3.0.0 вы можете использовать _.toPlainObject
источник
Вот рекурсивная функция, которую я только что написал. Это просто и хорошо работает.
Вот пример ( jsFiddle ):
Результаты:
источник
['a' = '1', 'b' = '2', 'c' = '3']
и хотите, чтобы{a: 1, b: 2, c: 3}
это работало идеально.[DOCS]
или более многословный
или
самый короткий с ванильным JS
более сложный пример
еще короче (используя
function(e) {console.log(e); return e;}
===(e)=>(console.log(e),e)
)[/ Документы]
источник
[/docs]
? Было бы более полезно сделать исполняемые фрагменты кода.Я бы сделал это просто с
Array.of()
. Массив имеет возможность использовать его контекст в качестве конструктора.Таким образом, мы можем связываться
Array.of()
с функцией и генерировать массив, подобный объекту.Используя
Array.of()
его, можно даже выполнять подклассификацию массива .источник
Если вы можете использовать
Map
илиObject.assign
, это очень легко.Создать массив:
Ниже создается объект с индексом в качестве ключей:
Повторите то же, что и выше, с помощью Карт.
Преобразует в индексный объект и
{0 : 'css'}
т. Д.Преобразовать в объект, основанный на значении и
{css : 'css is great'}
т. Д.источник
Простой и дерзкий метод быстрого преобразования массива предметов в объект
Тогда, используя это так ...
Вывод:
Проверка типа:
И вещи не были бы завершены, если бы не было метода-прототипа
Используя как:
Вывод:
* ОБРАТИТЕ ВНИМАНИЕ, что подпрограммы именования не существует, поэтому, если вы хотите иметь конкретные имена, вам нужно будет продолжать использовать существующие методы ниже.
Более старый метод
Это позволяет генерировать из массива объект с ключами, которые вы определяете в том порядке, в котором вы их хотите.
console.log(">>> :" + result.onion);
выведет «paint», функция должна иметь массивы равной длины, иначе вы получите пустой объект.Вот обновленный метод
источник
Или использовать
источник
ES5 - Решение:
Используя функции прототипа Array «push» и «apply», вы можете заполнить объект элементами массива.
источник
{ name: a, div :b, salary:c}
Более поддерживаемый браузер и более гибкий способ сделать это, используя обычный цикл , что-то вроде:
Но и современным способом может быть использование оператора распространения , например:
Или объект назначить :
Оба вернутся :
источник
Вы можете использовать такую функцию:
Этот должен обрабатывать разреженные массивы более эффективно.
источник
Вот решение в coffeescript
источник
obj[i] = v for v,i in arr when v?