Como posso transformar um grande object
em array
lodash?
var obj = {
22: {name:"John", id:22, friends:[5,31,55], works:{books:[], films:[],}
12: {name:"Ivan", id:12, friends:[2,44,12], works:{books:[], films:[],}
}
// transform to
var arr = [{name:"John", id:22...},{name:"Ivan", id:12...}]
javascript
arrays
object
lodash
siavolt
fonte
fonte
Respostas:
Você pode fazer
Para documentação veja aqui.
fonte
id
propriedade não existia e que queria criá-la com base na chave de cada objeto.var arr = _.values(_.mapKeys(obj, function(value, key) { value.id = key; return value; }));
return
valor para uma matriz como este:const divisionsList = []; _.mapKeys(divisions, (value, key) => { divisionsList[key] = value; });
Eu apreciaria quaisquer comentários ou sugestões para melhorar esta abordagem.const toArrayWithKey = (obj, keyAs) => _.values(_.mapValues(obj, (value, key) => { value[keyAs] = key; return value; }));
Saídas como:
fonte
toArray
não há como preservar as chaves, se necessário.Uma solução nativa moderna, se alguém estiver interessado:
ou (não IE):
fonte
Object.keys(obj).map(key=>({key,value: obj[key]}))
const arr = Object.keys(obj).map(id => ({ id, ...obj[id] }));
isso traria todo o objeto para os dados retornados não? (usando 'id' desde o consulente originais queria armazenar sua chave como o prop id)Para mim, isso funcionou:
Acontece
para dentro
fonte
_.map(data, (v,k)=>({[k]: v}))
ver minha resposta para detalhes._.toPairs
e_fromPairs
é adicional e desnecessário aqui.[{key: 'someKey', val: 'The value'}, {....},...]
Existem algumas maneiras de obter o resultado que você procura. Vamos dividi-los em categorias:
Somente valores ES6 :
O principal método para isso é Object.values . Mas, usando Object.keys e Array.map, você também pode obter o resultado esperado:
Mostrar snippet de código
Chave e valor ES6 :
Usando o mapa e as propriedades / destruição dinâmicas / computadas do ES6, você pode reter a chave e retornar um objeto do mapa.
Mostrar snippet de código
Apenas valores Lodash :
O método projetado para isso é,
_.values
no entanto, existem "atalhos", como_.map
o método utilitário,_.toArray
que também retornaria uma matriz contendo apenas os valores do objeto. Você poderia também_.map
se o_.keys
e obter os valores do objeto usando aobj[key]
notação.Nota:
_.map
quando passado, um objeto usaria seubaseMap
manipulador, que está basicamenteforEach
nas propriedades do objeto.Mostrar snippet de código
Chave e valor Lodash :
Mostrar snippet de código
Observe que nos exemplos acima, o ES6 é usado (funções de seta e propriedades dinâmicas). Você pode usar o lodash
_.fromPairs
e outros métodos para compor um objeto se o ES6 for um problema.fonte
Se você deseja que a chave (id neste caso) seja preservada como uma propriedade de cada item da matriz, você pode fazer
fonte
Atualização de 2017: Object.values , lodash values e toArray fazem isso. E para preservar o mapa de chaves e espalhar o operador, jogue bem:
fonte
Transformando objeto em matriz com JavaScript simples (
ECMAScript-2016
)Object.values
:Se você também quer manter o uso chaves
Object.entries
eArray#map
como isto:fonte
var arr = _.map(obj)
Você também pode usar a
_.map
função (de amboslodash
eunderscore
)object
, ele manipulará internamente esse caso, iterará sobre cada valor e chave com seu iterado e, finalmente, retornará uma matriz. De fato, você pode usá-lo sem nenhum iterado (apenas_.map(obj)
) se quiser apenas uma matriz de valores. A parte boa é que, se você precisar de alguma transformação no meio, poderá fazê-lo de uma só vez.Exemplo:
Mostrar snippet de código
No entanto, se você quiser transformar seu objeto, poderá fazê-lo, mesmo que precise preservar a chave, faça isso (
_.map(obj, (v, k) => {...}
) com argumentos adicionaismap
e use-o como desejar.No entanto, existem outras soluções Vanilla JS para isso (como todas as
lodash
soluções devem ter uma versão JS pura), como:Object.keys
e entãomap
eles para valoresObject.values
(no ES-2017)Object.entries
e depoismap
cada par de chave / valor (no ES-2017)for...in
faça um loop e use cada tecla para encontrar valoresE muito mais. Mas como essa pergunta é para
lodash
(e assumindo que alguém já a esteja usando), você não precisa pensar muito sobre versão, suporte a métodos e tratamento de erros, se não forem encontrados.Existem outras soluções Lodash como
_.values
(mais legíveis para fins específicos), ou obter pares e, em seguida, mapear e assim por diante. mas, se o seu código precisar de flexibilidade, você poderá atualizá-lo no futuro, pois precisará preservarkeys
ou transformar um pouco os valores; a melhor solução é usar um único_.map
como endereço nesta resposta. Isso não será tão difícil quanto a legibilidade também.fonte
Objeto para matriz
De todas as respostas, acho que essa é a melhor:
que transforma:
para:
Matriz para objeto
Para transformar de volta:
Para transformar novamente mantendo a chave no valor:
Darei:
Para o último exemplo, você também pode usar lodash
_.keyBy(arr, 'key')
ou_.keyBy(arr, i => i.key)
.fonte
Se você deseja algum mapeamento personalizado (como Array.prototype.map original) de Object em uma Matriz, basta usar
_.forEach
:Consulte o
lodash
documento de _.forEach https://lodash.com/docs/#forEachfonte