根据uniqueValues过滤对象数组

时间:2020-02-10 17:37:07

标签: javascript arrays hashmap

我有一个需要过滤的对象数组。 对象结构如下:

[
    {
        name: 'Wheat',
        group: { name: 'Grains' }
    }, {
        name: 'Rice',
        group: { name: 'Grains' }
    }, {
        name: 'corn',
        group: { name: 'Grains' }
    }, {
        name: 'Oats',
        group: { name: 'Grains' }
    }, {
        name: 'Live Cattle',
        group: { name: 'Livestock/meat products' }
    }, {
        name: 'pork Bellies',
        group: { name: 'Livestock/meat products' }
    }
]

我需要类似这样的东西才能在GUI上显示它。 根据他们的组名分离出数组。由于组名将是唯一的,但是每个组下都可以有多个选择。

因此,我想创建一个HashMap,其键为组名,值为名。 HashMap如下所示:

{
    'Grains':                  'Oats',
    'Grains':                  'Wheat',
    'Grains':                  'corn',
    'Livestock/meat products': 'Live Cattle',
    'Livestock/meat products': 'pork Bellies'
}

如何使用数组函数来实现此目的,或者需要使用单独的逻辑来创建HashMap?

谢谢

2 个答案:

答案 0 :(得分:0)

您不能生成具有重复键的Map。因此,您可以替换键和值,然后就可以了,例如:

const
  data = [
      {
          name: 'Wheat',
          group: { name: 'Grains' }
      }, {
          name: 'Rice',
          group: { name: 'Grains' }
      }, {
          name: 'corn',
          group: { name: 'Grains' }
      }, {
          name: 'Oats',
          group: { name: 'Grains' }
      }, {
          name: 'Live Cattle',
          group: { name: 'Livestock/meat products' }
      }, {
          name: 'pork Bellies',
          group: { name: 'Livestock/meat products' }
      }
  ],
  result = data.map(({ name, group }) => [name, group.name]),
  resultAsMap = new Map(result);

或者,如果有帮助,您可以创建一组字符串,例如:

  result = new Set(data.map(({ name, group }) => `${group.name}: ${name}`));

您也可以按照您的情况进行“分组依据”:

  reducer = (map, { name, group }) => map.set(group.name, (map.get(group.name) || []).concat(name)),
  result = data.reduce(reducer, new Map);

答案 1 :(得分:0)

这是完美的方法。调用此函数时传递数据。

function formatData(data) {
  const formattedData = {}
  data.forEach(({name, group}) => {
    formattedData[group.name] = formattedData[group.name] ? formattedData[group.name].concat(name) : [name];
  });
  return formattedData;
}