Qual é a melhor maneira de converter:
['a','b','c']
para:
{
0: 'a',
1: 'b',
2: 'c'
}
javascript
arrays
node.js
object
David Hellsing
fonte
fonte
_.keyBy
(anteriormente_.indexBy
): lodash.com/docs#keyBy_.toPlainObject
. Ex:var myObj = _.toPlainObject(myArr)
Respostas:
O ECMAScript 6 apresenta o facilmente polifillable
Object.assign
:A própria
length
propriedade da matriz não é copiada porque não é enumerável.Além disso, você pode usar a sintaxe de expansão ES6 para obter o mesmo resultado:
fonte
{ ...[sortedArray]}
Com uma função como esta:
Sua matriz já é mais ou menos apenas um objeto, mas as matrizes têm algum comportamento "interessante" e especial em relação às propriedades com número inteiro. O texto acima fornecerá um objeto simples.
edite oh também você pode querer considerar "buracos" na matriz:
Nos tempos de execução modernos do JavaScript, você pode usar o
.reduce()
método:Esse também evita "buracos" na matriz, porque é assim que
.reduce()
funciona.fonte
[]
) se você não usar chaves de propriedade numéricas e a propriedade "length".const obj = arr.reduce((obj, cur, i) => { return { ...obj, [i]: cur }; }, {});
const obj = arr.reduce((obj, cur, i) => ({ ...obj, [i]: cur }), {});
Você pode usar um acumulador aka
reduce
.Passe um objeto vazio
{}
como ponto de partida; depois "aumente" esse objeto incrementalmente. No final das iterações,result
será{"0": "a", "1": "b", "2": "c"}
Se sua matriz for um conjunto de objetos de pares de valores-chave:
vai produzir:
{a: 1, b: 2, c: 3}
Por uma questão de integridade,
reduceRight
permite iterar sua matriz na ordem inversa:vai produzir:
{c:3, b:2, a:1}
Seu acumulador pode ser de qualquer tipo para seu objetivo específico. Por exemplo, para trocar a chave e o valor do seu objeto em uma matriz, passe
[]
:vai produzir:
[{1: "a"}, {2: "b"}, {3: "c"}]
Ao contrário
map
,reduce
não pode ser usado como um mapeamento 1-1. Você tem controle total sobre os itens que deseja incluir ou excluir. Portanto,reduce
você pode conseguir o quefilter
faz, o que tornareduce
muito versátil:vai produzir:
[{2: "b"}, {3: "c"}]
Cuidado :
reduce
eObject.key
fazem parteECMA 5th edition
; você deve fornecer um polyfill para navegadores que não os suportam (principalmente o IE8).Veja uma implementação padrão do Mozilla .
fonte
Se você estiver usando jquery:
fonte
{0: 'a', 1: 'b', 2: 'c'}
o resultado esperado.Para completar, o ECMAScript 2015 (ES6) está se espalhando. Exigirá um transpiler (Babel) ou um ambiente executando pelo menos ES6.
fonte
Eu provavelmente escreveria dessa maneira (já que muito raramente não terei a biblioteca underscorejs em mãos):
fonte
obj=_.extend({},a);
faria o trabalho. Além disso, se você estiver iterando através de matrizes, eu diria que_.each
seria mais apropriado do que_.map
. Em suma, esta não é uma boa resposta em vários níveis.Aqui está um método O (1) ES2015 apenas para ser completo.
fonte
length
propriedade. (3) O objeto ainda é uma matrizArray.isArray(arr) === true
,. (4) Comportamentos especiais de matriz não são removidos, por exemplo,arr.length = 0
remove todos os índices. (5) Portanto, acho queObject.assign
é muito melhor .Array.isArray
está retornandotrue
para o "objeto" aqui, emborainstanceof Array
não ...Surpreso por não ver -
fonte
{ "first":"a", "second":"b","third":"c" }
com as chaves sendo corrigidas - Estou procurando uma destruiçãopodemos usar
Object.assign
earray.reduce
funcionar para converter uma matriz em objeto.fonte
Acabei usando o operador de propagação de objetos, pois faz parte do padrão ECMAScript 2015 (ES6).
Fez o violino a seguir como exemplo.
fonte
A maneira mais fácil no JavaScript moderno é usar
Object.assign()
que não faz nada além de copiar a chave: valor de um objeto para outro. No nosso caso,Array
doa propriedades para novas{}
.fonte
O.assign
mas faltava explicação. Hoje em dia desestruturação matriz em objecto é uma forma ({...array}
)Para o ES2016, espalhe o operador para objetos. Nota: Isso ocorre depois do ES6 e, portanto, o transpiler precisará ser ajustado.
fonte
Cinco anos depois, há um bom caminho :)
Object.assign
foi introduzido no ECMAScript 2015.fonte
Usando
javascript#forEach
um pode fazer issoCom o ECMA6:
fonte
FWIW, uma outra abordagem recente é usar o novo
Object.fromEntries
juntamente comObject.entries
o seguinte:... o que permite evitar o armazenamento de itens esparsos da matriz como
undefined
ounull
e preserva chaves não indexadas (por exemplo, número inteiro não positivo / não numérico).Pode-se acrescentar
arr.length
, no entanto, que isso não está incluído:fonte
você pode usar o operador spread
fonte
Se você estiver usando o ES6, poderá usar Object.assign e o operador spread
Se você tiver uma matriz aninhada como
fonte
new Map([['key1', 'value1'], ['key2', 'value2']]);
Rápido e sujo:
fonte
{0:"c", 1:"b", 2:"a"}
. Você quer emunshift
vez depop
ou (melhor) começa comi=arr.length-1
e diminui.l = arr.length
, e entãowhile (l && (obj[--l] = arr.pop())){}
(eu percebo que isso é antigo, mas por que não simplificá-lo ainda mais)?Rápido e sujo # 2:
fonte
i < a.length
vez dea[i]
.No Lodash 3.0.0, você pode usar _.toPlainObject
fonte
Aqui está uma função recursiva que acabei de escrever. É simples e funciona bem.
Aqui está um exemplo ( jsFiddle ):
Resultados:
fonte
['a' = '1', 'b' = '2', 'c' = '3']
quiser e quiser, assim{a: 1, b: 2, c: 3}
funciona perfeitamente.[docs]
ou mais detalhado
ou
o mais curto com baunilha JS
algum exemplo mais complexo
ainda mais curto (usando
function(e) {console.log(e); return e;}
===(e)=>(console.log(e),e)
)[/ docs]
fonte
[/docs]
? Seria mais útil tornar os trechos de código executáveis.Eu faria isso simplesmente com
Array.of()
. A matriz de tem a capacidade de usar seu contexto como construtor.Portanto, podemos vincular
Array.of()
a uma função e gerar uma matriz como objeto.Utilizando
Array.of()
um pode-se até fazer subclassificação de array .fonte
Se você pode usar
Map
ouObject.assign
, é muito fácil.Crie uma matriz:
A seguir, cria um objeto com o índice como chaves:
Replicar o mesmo que acima com o Maps
Converte em um objeto baseado em índice,
{0 : 'css'}
etc ...Converter em um objeto baseado em valor,
{css : 'css is great'}
etc ...fonte
Um método simples e atrevido de converter rapidamente uma matriz de itens em um objeto
Então, usando-o assim ...
Resultado:
Verificando o tipo:
E as coisas não estariam completas se não houvesse um método de protótipo
Usando como:
Resultado:
* OBSERVE que não há rotina de nomeação; portanto, se você quiser ter nomes específicos, precisará continuar usando os métodos existentes abaixo.
Método mais antigo
Isso permite gerar a partir de uma matriz um objeto com as chaves definidas na ordem em que você as deseja.
console.log(">>> :" + result.onion);
produzirá "paint", a função precisa ter matrizes de comprimento igual ou você obtém um objeto vazio.Aqui está um método atualizado
fonte
Ou use
fonte
ES5 - Solução:
Usando a função de protótipo Array 'push' e 'apply', você pode preencher o objeto com os elementos da matriz.
fonte
{ name: a, div :b, salary:c}
Uma maneira mais flexível e suportada pelo navegador de fazer isso é usar um loop normal , algo como:
Mas também a maneira moderna pode estar usando o operador spread , como:
Ou Atribuição de objeto :
Ambos retornarão :
fonte
Você poderia usar uma função como esta:
Este deve lidar com matrizes esparsas com mais eficiência.
fonte
Aqui está uma solução em coffeescript
fonte
obj[i] = v for v,i in arr when v?