基于属性将数组转换为地图的快捷方式

时间:2018-06-29 04:52:54

标签: javascript node.js

在处理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?

3 个答案:

答案 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);