在处理nodeJs
脚本时,我发现自己经常需要执行以下操作。
import _ from 'lodash'
let humans = [ {id: 'abc', name: 'Somebody 1'}, {id: 'xyz', name: 'Somebody 2'}];
let abcName = _.find(humans, {id: 'abc'}).name
是否有一个现有函数可用于将id转换为基于id的人类数组,这样我就可以调用而无需使用lodash
,而不必编写自己的代码即可进行转换?
let humans = [ {id: 'abc', name: 'Somebody 1'}, {id: 'xyz', name: 'Somebody 2'}];
let humansConvertedToMap = convertToMap(humans, 'id')
let abcName = humansConvertedToMap[id].name?
答案 0 :(得分:1)
您可以仅使用Array.reduce
将其映射到具有id属性的哈希映射中。
let humansMappedToId = humans.reduce(function(acc, val) {
acc[val.id] = val;
return acc;
}, {});
_.reduce
可以完成同样的操作,但是_.tranform
会更简单。
let humansConvertedToMap = _.transform(humans, function(m, v){
m[v.id] = v;
})
答案 1 :(得分:1)
以下是可以为您完成的功能:
const arrayOfObjectsToMapByKey = (arrayOfObjects, key) =>
arrayOfObjects.reduce((map, currentObject) => {
let k = currentObject[key];
if (map[k]) {
throw new Error("Repeated object key. Error thrown to stop overrides.");
}
map[k] = currentObject;
return map;
}, {});
因此您可以做自己想做的事情:
let humans = [ {id: 'abc', name: 'Somebody 1'}, {id: 'xyz', name: 'Somebody 2'}];
let humansConvertedToMap = arrayOfObjectsToMapByKey(humans, 'id')
let abcName = humansConvertedToMap[id].name;
答案 2 :(得分:1)
您可以使用Map
并将键/值对映射到构造函数。
let humans = [{ id: 'abc', name: 'Somebody 1' }, { id: 'xyz', name: 'Somebody 2' }],
humansMap = new Map(humans.map(o => [o.id, o])),
abcName = humansMap.get('abc').name;
console.log(abcName);