Gunakan Kasing
Use case adalah untuk mengubah array objek menjadi peta hash berdasarkan string atau fungsi yang disediakan untuk mengevaluasi dan menggunakan sebagai kunci dalam peta hash dan nilai sebagai objek itu sendiri. Kasus umum menggunakan ini adalah mengubah array objek menjadi peta objek hash.
Kode
Berikut ini adalah cuplikan kecil dalam JavaScript untuk mengonversi array objek ke peta hash, diindeks oleh nilai atribut objek. Anda dapat memberikan fungsi untuk mengevaluasi kunci dari peta hash secara dinamis (run time). Semoga ini bisa membantu seseorang di masa depan.
function isFunction(func) {
return Object.prototype.toString.call(func) === '[object Function]';
}
/**
* This function converts an array to hash map
* @param {String | function} key describes the key to be evaluated in each object to use as key for hashmap
* @returns Object
* @Example
* [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap("id")
* Returns :- Object {123: Object, 345: Object}
*
* [{id:123, name:'naveen'}, {id:345, name:"kumar"}].toHashMap(function(obj){return obj.id+1})
* Returns :- Object {124: Object, 346: Object}
*/
Array.prototype.toHashMap = function(key) {
var _hashMap = {}, getKey = isFunction(key)?key: function(_obj){return _obj[key];};
this.forEach(function (obj){
_hashMap[getKey(obj)] = obj;
});
return _hashMap;
};
Anda dapat menemukan intinya di sini: Konversi Array Objek ke HashMap .
javascript
arrays
hashmap
Naveen I
sumber
sumber
Jawaban:
Ini cukup sepele untuk dilakukan dengan
Array.prototype.reduce
:Catatan:
Array.prototype.reduce()
adalah IE9 +, jadi jika Anda perlu mendukung peramban yang lebih lama, Anda perlu mengisinya.sumber
result = arr.reduce((map, obj) => (map[obj.key] = obj.val, map), {});
Untuk penggemar one-liner ES6: Dresult = new Map(arr.map(obj => [obj.key, obj.val]));
. Yang paling penting, ini membuatnya sangat jelas bahwa peta sedang dikembalikan.Array.prototype.reduce
seperti yang diusulkan oleh jmar777.Map
memang lebih pendek tapi itu hal yang berbeda. Saya tetap sejalan dengan maksud aslinya. Ingat ini bukan forum, Anda mungkin ingin membaca lebih lanjut tentang struktur T / J SO.{ "foo": {key: 'foo', val: 'bar'}, "hello": {key: 'hello', val: 'world'} }
. Perhatikan bahwa setiap elemen asli harus disimpan secara keseluruhan . Atau menggunakan data Q:{"345": {id:345, name:"kumar"}, ...}
. FIX: Ubah kode menjadimap[obj.key] = obj;
Menggunakan ES6 Map ( didukung dengan sangat baik ), Anda dapat mencoba ini:
sumber
Map
Anda perlu menggunakan yangresult.get(keyName)
bertentangan dengan adilresult[keyName]
. Perhatikan juga bahwa objek apa pun dapat digunakan sebagai kunci dan bukan hanya string.var result = new Map(arr.map(i => [i.key, i.val] as [string, string]));
yang mungkin lebih mudah dimengerti oleh beberapa orang. Catatanas [string, string]
jenis pemeran ditambahkan.Result is: [["foo","bar"],["hello","world"]]
result
bukan hash seperti yang diminta oleh OP.var result = new Map<string, string>(arr.map(i => [i.key, i.val]));
Dengan lodash , ini bisa dilakukan menggunakan keyBy :
sumber
Menggunakan ES6 spread + Object.assign:
sumber
const hash = Object.assign({}, ...(<{}>array.map(s => ({[s.key]: s.value}))));
harus melakukan perubahan ini untuk bekerja dengan naskah.Menggunakan operator spread:
Demonstrasi potongan kode di jsFiddle .
sumber
Anda dapat menggunakan Array.prototype.reduce () dan Peta JavaScript yang sebenarnya, bukan hanya Obyek JavaScript .
Apa perbedaan antara Map dan Object?
Sebelumnya, sebelum Peta diimplementasikan dalam JavaScript, Objek telah digunakan sebagai Peta karena strukturnya yang serupa.
Tergantung pada kasus penggunaan Anda, jika Anda perlu memiliki kunci yang dipesan, perlu mengakses ukuran peta atau memiliki penambahan dan penghapusan yang sering dari peta, Peta lebih disukai.
Kutipan dari dokumen MDN :
Objek mirip dengan Maps yang memungkinkan Anda mengatur kunci ke nilai, mengambil nilai-nilai itu, menghapus kunci, dan mendeteksi apakah ada sesuatu yang disimpan pada kunci. Karena ini (dan karena tidak ada alternatif bawaan), Objek telah digunakan sebagai Maps secara historis; namun, ada perbedaan penting yang membuat penggunaan Peta lebih disukai dalam kasus-kasus tertentu:
sumber
(mapAccumulator, obj) {...}
untuk(mapAccumulator, obj) => {...}
Anda dapat menggunakan
Object.fromEntries()
metode baru .Contoh:
sumber
versi es2015:
sumber
Ini yang saya lakukan di TypeScript. Saya punya perpustakaan kecil di mana saya meletakkan hal-hal seperti ini
pemakaian:
atau jika Anda memiliki pengidentifikasi selain 'id'
sumber
Ada cara yang lebih baik untuk melakukan ini seperti yang dijelaskan oleh poster lain. Tetapi jika saya ingin tetap pada JS murni dan cara kuno maka di sini adalah:
sumber
Jika Anda ingin mengonversi ke Peta ES6 baru, lakukan ini:
Mengapa Anda harus menggunakan jenis Peta ini? Nah itu terserah kamu. Lihatlah ini .
sumber
Menggunakan Javascript sederhana
sumber
Dengan
lodash
:sumber
Peningkatan kecil pada
reduce
penggunaan:sumber
mencoba
Tampilkan cuplikan kode
sumber
Berikut ini adalah potongan kecil yang saya buat dalam javascript untuk mengubah array objek ke peta hash, diindeks oleh nilai atribut objek. Anda dapat memberikan fungsi untuk mengevaluasi kunci dari peta hash secara dinamis (run time).
Anda dapat menemukan intinya di sini: https://gist.github.com/naveen-ithappu/c7cd5026f6002131c1fa
sumber
Array.prototype
!