Javascript 是否有类似于 python 的字典理解?

Does Javascript have something similar to python's dict comprehension?

我收集了一组数据,输出如下所示:

[
    {
        hostName: 'server1',
        service: 'service1',
        perfData: 'unique string5',
        state: 1
    },
    {
        hostName: 'server1',
        service: 'service2',
        perfData: 'unique string4',
        state: 1
    },
    {
        hostName: 'server1',
        service: 'service3',
        perfData: 'unique string3',
        state: 1
    },
    {
        hostName: 'server2',
        service: 'service1',
        perfData: 'unique string2',
        state: 1
    },
    {
        hostName: 'server2',
        service: 'service2',
        perfData: 'unique string1',
        state: 1
    }
]

我正在尝试使用 javascript 遍历这个对象数组以输出以下内容:

let desiredOutput = [{'server1': [{
        service: 'service1',
        perfData: 'unique string1',
        state: 1
        },
        {
        service: 'service2',
        perfData: 'unique string1',
        state: 1
        },
        {
        service: 'service3',
        perfData: 'unique string1',
        state: 1
        }],
    'server2': {
        service: 'service1',
        perfData: 'unique string1',
        state: 1
    }
}];

Javascript有没有类似dict comprehension的东西?不确定如何遍历对象数组并将它们合并并使它们成为具有对象数组的对象。在 python 我可以使用这样的东西:

raw_data = [{'hostName': 'server1', 'serviceName': 'service1'}, {'hostName': 'server1', 'serviceName': 'service2'}, {'hostName': 'server1', 'serviceName': 'service3'}, {'hostName': 'server2', 'serviceName': 'service1'}, {'hostName': 'server2', 'serviceName': 'service2'}]
services = defaultdict(list)
for service in raw_data:
    host_name = service.get('hostName')
    service_name = service.get('service')
    new_dict = {'hostName': host_name, 'serviceName': service_name}
    services[new_dict['hostName']].append(new_dict)
print(services)

我找到了与此相近的东西 但不是我要找的东西。

你的输出结构有点奇怪(一个元素的数组?)。使用 reduce 是一种合理的方法,为每个唯一键构建数组:

const data = [ { hostName: 'server1', service: 'service1', perfData: 'unique string5', state: 1 }, { hostName: 'server1', service: 'service2', perfData: 'unique string4', state: 1 }, { hostName: 'server1', service: 'service3', perfData: 'unique string3', state: 1 }, { hostName: 'server2', service: 'service1', perfData: 'unique string2', state: 1 }, { hostName: 'server2', service: 'service2', perfData: 'unique string1', state: 1 } ];

console.log([data.reduce((a, e) => {
  const name = e.hostName;
  delete e.hostName;
  a[name] = name in a ? a[name].push(e) && a[name] : [e];
  return a;
}, {})]);