Existe uma função Lodash integrada para fazer isso:
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
E produza isto:
var output = {
foo: 'bar',
baz: 'zle'
};
No momento, estou apenas usando Array.prototype.reduce()
:
function toHash(array, keyName, valueName) {
return array.reduce(function(dictionary, next) {
dictionary[next[keyName]] = next[valueName];
return dictionary;
}, {});
}
toHash(params, 'name', 'input');
Querendo saber se há um atalho lodash.
javascript
lodash
testemunho
fonte
fonte
_.keyBy
irá transformar todo o array em um objeto, enquanto a questão é principalmente sobre ter um item de cada objeto no array como chave e um outro item como seu valor. Se_.keyBy
for usado, todos os valores serão objetos.Você deve usar _.keyBy para converter facilmente uma matriz em um objeto.
Docs aqui
Exemplo de uso abaixo:
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; console.log(_.keyBy(params, 'name'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Se necessário, você pode manipular a matriz antes de usar _.keyBy ou o objeto depois de usar _.keyBy para obter o resultado desejado exato.
fonte
Sim, está aqui , usando
_.reduce
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; _.reduce(params , function(obj,param) { obj[param.name] = param.input return obj; }, {});
fonte
reduce()
surge com outro caso de uso. Maneira inteligente de fazer isso!_.reduce
menos que expresse com precisão o que você está tentando fazer: em qualquer outro caso, obscurece significativamente o ponto do código. Eu pessoalmente prefiro a_.zipObject
solução por @djechlin - caso contrário, a abordagem_.keyBy
/_.mapValues
.Isso parece um trabalho para Object.assign:
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
Editado para empacotar como uma função semelhante aos OPs, seria:
const toHash = (array, keyName, valueName) => Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
(Obrigado a Ben Steward, boa ideia ...)
fonte
Você pode usar um javascript de liner com método de redução de matriz e desestruturação ES6 para converter a matriz de pares de valores-chave em objeto.
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
fonte
Provavelmente, isso é mais detalhado do que você deseja, mas está solicitando uma operação um pouco complexa, portanto, o código real pode estar envolvido (o horror).
Minha recomendação, com
zipObject
isso é muito lógico:_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
Outra opção, mais hacky, usando
fromPairs
:_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
A função anônima mostra a hackeabilidade - não acredito que JS garanta a ordem dos elementos na iteração do objeto, então callling
.values()
não servirá.fonte
fromPairs
, e chamar devalues()
fato não funciona. Pelo menos do ponto de vista da legibilidade.Outra maneira com lodash
criar pares e, em seguida, construir um objeto ou
ES6 Map
facilmente_(params).map(v=>[v.name, v.input]).fromPairs().value()
ou
_.fromPairs(params.map(v=>[v.name, v.input]))
Aqui está um exemplo prático
Exibir trecho de código
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; var obj = _(params).map(v=>[v.name, v.input]).fromPairs().value(); console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
fonte
Object.fromEntries(params.map(v => [v.name, v.input]))
Ele também pode resolver sem usar qualquer função lodash como esta:
let paramsVal = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; let output = {}; paramsVal.forEach(({name, input})=>{ output[name] = input; }) console.log(output);
fonte