用例
这个用例是根据提供的字符串或函数将对象数组转换为哈希映射,并将其作为哈希映射中的键来计算和使用,并将值作为对象本身。使用这种方法的常见情况是将对象数组转换为对象的哈希映射。
Code
下面是一个JavaScript小片段,用于将对象数组转换为哈希映射,以object的属性值为索引。您可以提供一个函数来动态计算散列映射的键(运行时)。
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。
这就是我在TypeScript中所做的,我有一个小utils库,我在那里放了这样的东西
export const arrayToHash = (array: any[], id: string = 'id') =>
array.reduce((obj, item) => (obj[item[id]] = item , obj), {})
用法:
const hash = arrayToHash([{id:1,data:'data'},{id:2,data:'data'}])
或者如果你有一个id以外的标识符
const hash = arrayToHash([{key:1,data:'data'},{key:2,data:'data'}], 'key')
try
let toHashMap = (a,f) => a.reduce((a,c)=> (a[f(c)]=c,a),{});
让arr = (
{id: 123,名字:“弄”},
{id: 345,名字:“kumar”}
];
让fkey = o => o.id;//函数将对象更改为字符串(key)
让toHashMap = (f) = > a.reduce ((a、c) = > ((f (c)) = c, a), {});
console.log(toHashMap(arr,fkey));
//不推荐添加到原型:
//
// Array.prototype.toHashMap = function(f){返回toHashMap(this,f)};
// console.log(arr.toHashMap(fkey));
lodash:
const items = [
{ key: 'foo', value: 'bar' },
{ key: 'hello', value: 'world' }
];
const map = _.fromPairs(items.map(item => [item.key, item.val]));
// OR: if you want to index the whole item by key:
// const map = _.fromPairs(items.map(item => [item.key, item]));
lodash fromPairs函数让我想起了Python中的zip函数
链接到lodash
正如其他帖子解释的那样,有更好的方法来做到这一点。但如果我想坚持纯JS和老式的方式,那么它是:
var arr = [
{ key: 'foo', val: 'bar' },
{ key: 'hello', val: 'world' },
{ key: 'hello', val: 'universe' }
];
var map = {};
for (var i = 0; i < arr.length; i++) {
var key = arr[i].key;
var value = arr[i].val;
if (key in map) {
map[key].push(value);
} else {
map[key] = [value];
}
}
console.log(map);