Apakah ada fungsi lodash bawaan untuk melakukan ini:
var params = [
{ name: 'foo', input: 'bar' },
{ name: 'baz', input: 'zle' }
];
Dan keluaran ini:
var output = {
foo: 'bar',
baz: 'zle'
};
Saat ini saya hanya menggunakan 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');
Ingin tahu apakah ada jalan pintas lodash.
javascript
lodash
inti
sumber
sumber
_.keyBy
akan mengubah seluruh array menjadi sebuah objek, sedangkan pertanyaannya sebagian besar tentang memiliki satu item dari setiap objek dalam array sebagai kunci dan satu item lainnya sebagai nilainya. Jika_.keyBy
digunakan, maka semua nilai akan menjadi objek.Anda harus menggunakan _.keyBy untuk mengonversi larik menjadi objek dengan mudah.
Dokumen di sini
Contoh penggunaan di bawah ini:
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>
Jika diperlukan, Anda dapat memanipulasi array sebelum menggunakan _.keyBy atau objek setelah menggunakan _.keyBy untuk mendapatkan hasil yang diinginkan.
sumber
Ya di sini , menggunakan
_.reduce
var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; _.reduce(params , function(obj,param) { obj[param.name] = param.input return obj; }, {});
sumber
reduce()
masuk dengan kasus penggunaan lain. Cara cerdas melakukannya!_.reduce
kecuali jika itu secara akurat mengungkapkan apa yang Anda coba lakukan: itu secara signifikan mengaburkan inti kode dalam kasus lain. Saya pribadi lebih suka_.zipObject
solusi oleh @djechlin - jika gagal, pendekatan_.keyBy
/_.mapValues
.Ini sepertinya pekerjaan untuk Object.assign:
const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));
Diedit untuk membungkus sebagai fungsi yang mirip dengan OP, ini akan menjadi:
const toHash = (array, keyName, valueName) => Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));
(Terima kasih kepada Ben Steward, pemikiran yang bagus ...)
sumber
Anda dapat menggunakan satu liner javascript dengan metode pengurangan array dan ES6 merusak untuk mengonversi array pasangan nilai kunci menjadi objek.
arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
sumber
Ini mungkin lebih bertele-tele dari yang Anda inginkan, tetapi Anda meminta operasi yang sedikit rumit sehingga kode sebenarnya mungkin terlibat (ngeri).
Rekomendasi saya, dengan
zipObject
itu cukup logis:_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
Opsi lain, lebih hacky, menggunakan
fromPairs
:_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
Fungsi anonim menunjukkan peretasan - Saya tidak percaya JS menjamin urutan elemen dalam iterasi objek, jadi pemanggilan
.values()
tidak akan berhasil.sumber
fromPairs
, dan panggilanvalues()
memang tidak akan berhasil. Setidaknya dari sudut pandang keterbacaan.Cara lain dengan lodash
membuat pasangan, dan kemudian membuat objek atau
ES6 Map
dengan mudah_(params).map(v=>[v.name, v.input]).fromPairs().value()
atau
_.fromPairs(params.map(v=>[v.name, v.input]))
Berikut adalah contoh yang berfungsi
Tampilkan cuplikan kode
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>
sumber
Object.fromEntries(params.map(v => [v.name, v.input]))
Itu juga bisa diselesaikan tanpa menggunakan fungsi lodash apa pun seperti ini:
let paramsVal = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; let output = {}; paramsVal.forEach(({name, input})=>{ output[name] = input; }) console.log(output);
sumber