Javascript JS中的数据透视与转换
我想用JavaScript进行客户端数据转换,例如,我想转换: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']] +
[
{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")})
});