Przypadek użycia
Przypadek użycia polega na przekształceniu tablicy obiektów w mapę skrótu na podstawie ciągu znaków lub funkcji przewidzianej do oceny i użycia jako klucza w mapie skrótu i wartości jako samego obiektu. Częstym przypadkiem korzystania z tego jest konwertowanie tablicy obiektów na mapę obiektów mieszających.
Kod
Poniżej znajduje się niewielki fragment kodu JavaScript służący do konwersji tablicy obiektów na mapę skrótu, indeksowaną wartością atrybutu obiektu. Możesz zapewnić funkcję do dynamicznej oceny klucza mapy skrótu (czas działania). Mam nadzieję, że to pomoże komuś w przyszłości.
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;
};
Można znaleźć sedno tutaj: Konwertuje tablicę obiektów na HashMap .
javascript
arrays
hashmap
Naveen I
źródło
źródło
Odpowiedzi:
Jest to dość trywialne w przypadku
Array.prototype.reduce
:Uwaga:
Array.prototype.reduce()
jest IE9 +, więc jeśli potrzebujesz obsługi starszych przeglądarek, musisz go wypełnić.źródło
result = arr.reduce((map, obj) => (map[obj.key] = obj.val, map), {});
Dla fanów One-Liner ES6: Dresult = new Map(arr.map(obj => [obj.key, obj.val]));
. Co najważniejsze, jest bardzo jasne, że mapa jest zwracana.Array.prototype.reduce
zaproponowana przez jmar777.Map
jest rzeczywiście krótszy, ale to inna sprawa. Trzymałem się pierwotnego celu. Pamiętaj, że to nie jest forum, możesz przeczytać więcej o strukturze SO Q / A.{ "foo": {key: 'foo', val: 'bar'}, "hello": {key: 'hello', val: 'world'} }
. Pamiętaj, że każdy oryginalny element powinien być zachowany w całości . Lub z wykorzystaniem danych Q za:{"345": {id:345, name:"kumar"}, ...}
. POPRAWKA: Zmień kod namap[obj.key] = obj;
Korzystając z mapy ES6 ( całkiem dobrze obsługiwanej ), możesz spróbować:
źródło
Map
musisz użyć,result.get(keyName)
a nie tylkoresult[keyName]
. Należy również pamiętać, że dowolny obiekt może być używany jako klucz, a nie tylko ciąg znaków.var result = new Map(arr.map(i => [i.key, i.val] as [string, string]));
niektórych może być łatwiejsza do zrozumienia.as [string, string]
Dodano rzutowanie typu notatki .Result is: [["foo","bar"],["hello","world"]]
result
nie jest hashem, jak wymaga OP.var result = new Map<string, string>(arr.map(i => [i.key, i.val]));
W przypadku lodash można to zrobić za pomocą keyBy :
źródło
Za pomocą ES6 spread + Object.assign:
źródło
const hash = Object.assign({}, ...(<{}>array.map(s => ({[s.key]: s.value}))));
musiałem dokonać tej zmiany, aby pracować z maszynopisem.Za pomocą operatora rozprzestrzeniania:
Demonstracja fragmentu kodu w jsFiddle .
źródło
Możesz użyć Array.prototype.reduce () i rzeczywistej mapy JavaScript zamiast tylko obiektu JavaScript .
Czym różni się mapa od obiektu?
Wcześniej, zanim mapa została zaimplementowana w JavaScript, obiekt był używany jako mapa ze względu na podobną strukturę.
W zależności od przypadku użycia, jeśli potrzebujesz mieć zamówione klucze, musisz uzyskać dostęp do rozmiaru mapy lub często dodawać i usuwać mapę, preferowana jest mapa.
Cytat z dokumentu MDN :
Obiekty są podobne do Map, ponieważ oba umożliwiają ustawianie kluczy na wartości, pobieranie tych wartości, usuwanie kluczy i wykrywanie, czy coś jest przechowywane pod kluczem. Z tego powodu (i ponieważ nie było wbudowanych alternatyw) Obiekty były historycznie używane jako Mapy; istnieją jednak ważne różnice, które sprawiają, że korzystanie z mapy jest lepsze w niektórych przypadkach:
źródło
(mapAccumulator, obj) {...}
na(mapAccumulator, obj) => {...}
Możesz użyć nowej
Object.fromEntries()
metody.Przykład:
źródło
wersja es2015:
źródło
To, co robię w TypeScript, mam małą bibliotekę utils, w której umieszczam takie rzeczy
stosowanie:
lub jeśli masz identyfikator inny niż „id”
źródło
Są lepsze sposoby na to, jak wyjaśniono w innych plakatach. Ale jeśli chcę trzymać się czystego stylu JS i staromodnego, oto:
źródło
Jeśli chcesz przekonwertować na nową mapę ES6, wykonaj następujące czynności:
Dlaczego warto korzystać z tego typu mapy? Cóż, to zależy od ciebie. Spójrz na to .
źródło
Korzystanie z prostego Javascript
źródło
Z
lodash
:źródło
Niewielka poprawa
reduce
użytkowania:źródło
próbować
Pokaż fragment kodu
źródło
Poniżej znajduje się mały fragment, który utworzyłem w javascript, aby przekonwertować tablicę obiektów na mapę skrótu, indeksowaną według wartości atrybutu obiektu. Możesz zapewnić funkcję do dynamicznej oceny klucza mapy skrótu (czas działania).
Możesz znaleźć sedno tutaj: https://gist.github.com/naveen-ithappu/c7cd5026f6002131c1fa
źródło
Array.prototype
!