Случай использования
Вариант использования - преобразование массива объектов в хеш-карту на основе строки или функции, предоставленной для оценки и использования в качестве ключа в хеш-карте и значения в качестве самого объекта. Распространенным случаем использования этого является преобразование массива объектов в хэш-карту объектов.
Код
Ниже приведен небольшой фрагмент в JavaScript для преобразования массива объектов в хэш-карту, проиндексированную по значению атрибута объекта. Вы можете предоставить функцию для динамической оценки ключа хэш-карты (время выполнения). Надеюсь, это поможет кому-то в будущем.
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;
};
Вы можете найти суть здесь: Преобразует массив объектов в HashMap .
javascript
arrays
hashmap
Навин я
источник
источник
Ответы:
Это довольно тривиально, чтобы сделать с
Array.prototype.reduce
:Примечание:
Array.prototype.reduce()
это IE9 +, поэтому, если вам нужно поддерживать старые браузеры, вам нужно его заполнить.источник
result = arr.reduce((map, obj) => (map[obj.key] = obj.val, map), {});
Для фанатов ES6 с одним вкладышем: Dresult = new Map(arr.map(obj => [obj.key, obj.val]));
. Что наиболее важно, это очень ясно дает понять, что карта возвращается.Array.prototype.reduce
предложен jmar777.Map
действительно короче, но это совсем другое. Я придерживался первоначального намерения. Помните, что это не форум, вы можете прочитать больше о структуре SO Q / A.{ "foo": {key: 'foo', val: 'bar'}, "hello": {key: 'hello', val: 'world'} }
. Обратите внимание, что каждый оригинальный элемент должен быть сохранен целиком . Или , используя данные добротность в:{"345": {id:345, name:"kumar"}, ...}
. FIX: Изменить код будетmap[obj.key] = obj;
Используя ES6 Map ( довольно хорошо поддерживается ), вы можете попробовать это:
источник
Map
то нужно использовать,result.get(keyName)
а не простоresult[keyName]
. Также обратите внимание, что любой объект может быть использован в качестве ключа, а не просто строка.var result = new Map(arr.map(i => [i.key, i.val] as [string, string]));
некоторые могут найти ее более понятной.as [string, string]
Добавлен тип заметки .Result is: [["foo","bar"],["hello","world"]]
result
не является хешем, как того требует OP.var result = new Map<string, string>(arr.map(i => [i.key, i.val]));
С помощью lodash это можно сделать с помощью keyBy :
источник
Использование ES6 spread + Object.assign:
источник
const hash = Object.assign({}, ...(<{}>array.map(s => ({[s.key]: s.value}))));
пришлось сделать это изменение для работы с машинописью.Используя оператор распространения:
Демонстрация фрагмента кода на jsFiddle .
источник
Вы можете использовать Array.prototype.reduce () и реальную карту JavaScript вместо просто объекта JavaScript .
Что отличается между картой и объектом?
Ранее, до того как Map была реализована в JavaScript, Object использовался в качестве Map из-за их схожей структуры.
В зависимости от вашего случая использования, если вам нужны заказанные ключи, вам нужен доступ к размеру карты или частое добавление и удаление с карты, карта предпочтительна.
Цитата из документа MDN :
объекты похожи на Карты в том, что оба позволяют устанавливать ключи к значениям, извлекать эти значения, удалять ключи и определять, хранится ли что-то в ключе. Из-за этого (и потому что не было никаких встроенных альтернатив), Объекты исторически использовались как Карты; однако, есть важные отличия, которые делают использование карты предпочтительным в определенных случаях:
источник
(mapAccumulator, obj) {...}
для(mapAccumulator, obj) => {...}
Вы можете использовать новый
Object.fromEntries()
метод.Пример:
источник
Версия es2015:
источник
Это то, что я делаю в TypeScript. У меня есть небольшая библиотека утилит, в которую я помещаю подобные вещи.
использование:
или если у вас есть идентификатор, отличный от «id»
источник
Есть лучшие способы сделать это, как объяснено другими авторами. Но если я хочу придерживаться чистого JS и по-старому, то вот оно:
источник
Если вы хотите перейти на новую карту ES6, сделайте это:
Почему вы должны использовать этот тип карты? Ну, это зависит от вас. Посмотрите на это .
источник
Используя простой Javascript
источник
С
lodash
:источник
Небольшое улучшение в
reduce
использовании:источник
пытаться
Показать фрагмент кода
источник
Ниже приведен небольшой фрагмент, который я создал в javascript для преобразования массива объектов в хэш-карту, проиндексированную по значению атрибута объекта. Вы можете предоставить функцию для динамической оценки ключа хэш-карты (время выполнения).
Вы можете найти суть здесь: https://gist.github.com/naveen-ithappu/c7cd5026f6002131c1fa
источник
Array.prototype
!