Javascript JS中的数据透视与转换

Javascript JS中的数据透视与转换,javascript,data-structures,Javascript,Data Structures,我想用JavaScript进行客户端数据转换,例如,我想转换: [ {env:'test', name:'something'}, {env:'test', name:'else'}, {env:'prod', name:'entirely'}, ] 进入: 最好的方法是什么?图书馆还是蛮力?在Python中,我会使用列表理解,类似于: in_data = [...] d = defaultdict(list) for t in in_data: d[t['env']] +

我想用JavaScript进行客户端数据转换,例如,我想转换:

[
  {env:'test', name:'something'},
  {env:'test', name:'else'},
  {env:'prod', name:'entirely'},
]
进入:

最好的方法是什么?图书馆还是蛮力?在Python中,我会使用列表理解,类似于:

in_data = [...]
d = defaultdict(list)
for t in in_data:
    d[t['env']] += [t]
out_data = { 'envs': [{'name':k, 'things':v} for k,v in d.items()] }

我可以使用JS
map
或arrow函数来实现同样的功能吗,或者使用一些库?如果它在标准Chrome中运行(无需手动启用某些ES2015或类似功能),这将是一件好事。

您可以通过执行以下操作来实现:

var数据=[
{env:'test',name:'something'},
{env:'test',name:'else'},
{env:'prod',name:'all'},
];
var组=数据减少(功能(acc、obj){
acc[obj.env]=acc[obj.env]| | |[];
附件[obj.env].推送(obj);
返回acc;
}, {});
var结果={
环境:对象。键(组)。映射(函数(键){
返回{
姓名:key,,
事物:组[key].map(函数(obj){
返回{
名称:obj.name
}
})
}
})
};

控制台日志(结果)您可以通过执行以下操作来实现:

var数据=[
{env:'test',name:'something'},
{env:'test',name:'else'},
{env:'prod',name:'all'},
];
var组=数据减少(功能(acc、obj){
acc[obj.env]=acc[obj.env]| | |[];
附件[obj.env].推送(obj);
返回acc;
}, {});
var结果={
环境:对象。键(组)。映射(函数(键){
返回{
姓名:key,,
事物:组[key].map(函数(obj){
返回{
名称:obj.name
}
})
}
})
};

控制台日志(结果)您可以使用下划线库

function organizeObject(b){
   var a = _.map(_.groupBy(b, "env"), function(v, i){
        return {name: i, "things": _.map(v, function(i){return {name: i.name} })}
   });
   return {envs : a}
}

您可以使用下划线库

function organizeObject(b){
   var a = _.map(_.groupBy(b, "env"), function(v, i){
        return {name: i, "things": _.map(v, function(i){return {name: i.name} })}
   });
   return {envs : a}
}

我利用Set的唯一键的优点来获取test和prod,然后在这里使用此代码循环Set

首先创建
新集合(data.map(item=>item.env))一个新集合。然后是一个空的envs数组。然后循环、推送并将项目映射/过滤到envs数组中

set.forEach((item) => {
   envs.push({ name: item, things: data.map(d => { 
    if (d.env === item) {
        return {name: d.name}
    }
    return false;
   }).filter((f) => typeof f === "object")}) 
});

我利用Set的唯一键的优点来获取test和prod,然后在这里使用此代码循环Set

首先创建
新集合(data.map(item=>item.env))一个新集合。然后是一个空的envs数组。然后循环、推送并将项目映射/过滤到envs数组中

set.forEach((item) => {
   envs.push({ name: item, things: data.map(d => { 
    if (d.env === item) {
        return {name: d.name}
    }
    return false;
   }).filter((f) => typeof f === "object")}) 
});