Eu quero converter um objeto como este:
{"1":5,"2":7,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0}
em uma matriz de pares de valores-chave como este:
[[1,5],[2,7],[3,0],[4,0]...].
Como posso converter um objeto em uma matriz de pares de valores-chave em JavaScript?
javascript
arrays
type-conversion
Soptareanu Alex
fonte
fonte
NaN
. Se você quiser usar cordas como suas chaves, altere o retorno de[Number(key), obj[key]]
a[key, obj[key]]
ou usar oObject.entries
como @Pila sugeriu em sua respostaA melhor maneira é fazer:
A chamada
entries
, como mostrado aqui, retornará[key, value]
pares, conforme solicitado pelo solicitante.Como alternativa, você poderia chamar
Object.values(obj)
, o que retornaria apenas valores.fonte
A
Object.entries
função retorna quase a saída exata que você está solicitando, exceto que as teclas são cadeias de caracteres em vez de números.Se você precisar que as chaves sejam números, poderá mapear o resultado para uma nova matriz com uma função de retorno de chamada que substitua a chave em cada par por um número coagido a ela.
Eu uso uma função de seta e
Object.assign
para o retorno de chamada do mapa no exemplo acima, para que eu possa mantê-lo em uma instrução, aproveitando o fato deObject.assign
retornar o objeto ao qual está sendo atribuído, e o valor de retorno de uma única função de seta de instrução é o resultado da instrução.Isso é equivalente a:
Conforme mencionado por @TravisClarke nos comentários, a função de mapa pode ser reduzida para:
No entanto, isso criaria uma nova matriz para cada par de valores-chave, em vez de modificar a matriz existente, dobrando a quantidade de matrizes de pares de valores-chave criadas. Enquanto a matriz de entradas originais ainda estiver acessível, ela e suas entradas não serão coletadas como lixo.
Agora, mesmo que o uso do método local ainda use duas matrizes que contêm os pares de valores-chave (as matrizes de entrada e saída), o número total de matrizes muda apenas uma. As matrizes de entrada e saída não são realmente preenchidas com matrizes, mas as referências a matrizes e essas referências ocupam uma quantidade insignificante de espaço na memória.
Você poderia dar um passo adiante e eliminar completamente o crescimento modificando a matriz de entradas no local, em vez de mapear para uma nova matriz:
fonte
Object.entries(obj).map(e => [+e[0], e[1]]);
Para recapitular algumas dessas respostas agora em 2018, onde ES6 é o padrão.
Começando com o objeto:
Este último método, também poderia reorganizar a ordem da matriz, dependendo do valor das chaves. Às vezes, esse pode ser o comportamento desejado (às vezes não). Mas a vantagem agora é que os valores são indexados no slot de matriz correto, essencial e trivial para fazer pesquisas nele.
Por fim (não faz parte da pergunta original, mas para completar), se você precisar pesquisar facilmente usando a chave ou o valor, mas não desejar matrizes esparsas, sem duplicatas e sem reordenar sem a necessidade de converter em chaves numéricas ( mesmo pode acessar chaves muito complexas), então matriz (ou objeto) não é o que você precisa. Em
Map
vez disso, vou recomendar :https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
fonte
Mais uma solução, se
Object.entries
não funcionar para você.fonte
No Ecmascript 6,
violino
fonte
.map((value)=>(value))
parte não tem sentido - apenas retorna uma matriz de entrada exatamente equivalente à obtida naObject.entries(obj)
chamada.Uso
Object.keys
eArray#map
métodos.fonte
Use
Object.entries
para obter cada elemento do Object nokey & value
formato, emap
através deles como este:Mas, se você tiver certeza de que as chaves estarão em ordem progressiva, poderá usar
Object.values
eArray#map
fazer algo assim:fonte
Se você estiver usando o lodash, pode ser tão simples quanto isto:
fonte
Com o lodash, além da resposta fornecida acima, você também pode ter a chave na matriz de saída.
Sem as chaves do objeto na matriz de saída
para:
Se obj é o seguinte:
A matriz será:
Com as chaves do objeto na matriz de saída
Se você escrever em vez disso ('gênero' é uma sequência que você escolher):
Você vai ter:
fonte
Eu sugeriria esta solução mais simples de usar
Object.entries()
fonte
Você pode usar
Object.values([])
, pode precisar deste polyfill se ainda não:https://stackoverflow.com/a/54822153/846348
Então você pode simplesmente fazer:
Lembre-se de que matrizes em js podem usar apenas teclas numéricas; portanto, se você usou algo mais no objeto, elas se tornarão `` 0,1,2 ... x``
Pode ser útil remover duplicatas, por exemplo, se você tiver uma chave exclusiva.
fonte
Use para em
fonte
Objeto de conversão recursiva em matriz
fonte
Podemos mudar o número para o tipo String para Key, como abaixo:
fonte
fonte
Esta é minha implementação simples de barebone:
fonte
Solução simples
`
fonte
você pode usar _.castArray (obj) .
exemplo:
_.castArray({ 'a': 1 }); // => [{ 'a': 1 }]
fonte