如何使用正则表达式对数组中的Javascript对象进行排序

如何使用正则表达式对数组中的Javascript对象进行排序,javascript,arrays,sorting,object,Javascript,Arrays,Sorting,Object,我正在调用一个API,得到一个包含大量对象的数组。数组中有数百个对象,其中一个简短的片段如下所示: [ { "name": "total_kills_glock", "value": 70 }, { "name": "total_kills_mac10", "value": 39 }, { "name": "total_kills_ump45", "value": 136 },

我正在调用一个API,得到一个包含大量对象的数组。数组中有数百个对象,其中一个简短的片段如下所示:

[
    {
      "name": "total_kills_glock",
      "value": 70
    },
    {
      "name": "total_kills_mac10",
      "value": 39
    },
    {
      "name": "total_kills_ump45",
      "value": 136
    },
    {
      "name": "total_shots_glock",
      "value": 1262
    },
    {
      "name": "total_hits_glock",
      "value": 361
    }
    {
      "name": "total_shots_mac10",
      "value": 862
    },
    {
      "name": "total_hits_mac10",
      "value": 261
    },
    {
      "name": "total_shots_ump45",
      "value": 1610
    },
    {
      "name": "total_hits_ump45",
      "value": 598
    }
]
[
  {
    "name": "glock",
    "kills": 70,
    "shots": 1262,
    "hits": 361
  },
  {
    "name": "mac10",
    "kills": 39,
    "shots": 862,
    "hits": 261
  },
  {
    "name": "ump45",
    "kills": 136,
    "shots": 1610,
    "hits": 598
  }
]
是否有一种方法可以使用正则表达式对数组进行排序,使其看起来像这样:

[
    {
      "name": "total_kills_glock",
      "value": 70
    },
    {
      "name": "total_kills_mac10",
      "value": 39
    },
    {
      "name": "total_kills_ump45",
      "value": 136
    },
    {
      "name": "total_shots_glock",
      "value": 1262
    },
    {
      "name": "total_hits_glock",
      "value": 361
    }
    {
      "name": "total_shots_mac10",
      "value": 862
    },
    {
      "name": "total_hits_mac10",
      "value": 261
    },
    {
      "name": "total_shots_ump45",
      "value": 1610
    },
    {
      "name": "total_hits_ump45",
      "value": 598
    }
]
[
  {
    "name": "glock",
    "kills": 70,
    "shots": 1262,
    "hits": 361
  },
  {
    "name": "mac10",
    "kills": 39,
    "shots": 862,
    "hits": 261
  },
  {
    "name": "ump45",
    "kills": 136,
    "shots": 1610,
    "hits": 598
  }
]
您可以使用方法对数组项进行分组,使用方法从
name
string中提取名称和操作

var data=[{“name”:“total_kills_glock”,“value”:70},{“name”:“total_kills_mac10”,“value”:39},{“name”:“total_kills_ump45”,“value”:136},{“name”:“total_shots_glock”,“value”:1262},{“name”:“total_hits_glock”,“value”:361},{“name”:“total_shots_mac10”,“value”:862},{“name”:“total_hits_mac10”,“value”{“名称”:“总命中率”;“值”:1610},{“名称”:“总命中率”;“值”:598}];
var结果=数据减少((会计科目,当前)=>{
让words=curr.name.split(“”);
让名称=单词[2];
让行动=言语[1];
让item=acc.find(item=>item.name==name);
如果(项目){
项目[行动]=当前价值;
}否则{
加速推({
“姓名”:姓名,
[动作]:当前值
});
}
返回acc;
}, []);

console.log(result);
这里有一种方法,使用regex从原始名称中提取名称和数据类型,然后基于此构建一个对象:

const-raw=[{
“姓名”:“总死亡人数”,
“价值”:70
},
{
“名称”:“总死亡人数10”,
“价值”:39
},
{
“名称”:“总死亡人数”,
“价值”:136
},
{
“名称”:“总镜头数”,
“价值”:1262
},
{
“姓名”:“总点击次数”,
“价值”:361
},
{
“名称”:“总镜头数10”,
“价值”:862
},
{
“名称”:“总点击次数10次”,
“价值”:261
},
{
“名称”:“总射击次数”45,
“价值”:1610
},
{
“名称”:“总点击次数”45,
“价值”:598
}
];
var final=[];
var键=[];
raw.forEach(v=>{
const m=v.name.match(/^total_u(+[^]+)(+$/);
常数k=keys.indexOf(m[2]);
如果(k==-1){
var o={name:m[2]};
o[m[1]]=v.值;
最后,推(o);
按键。推(m[2]);
}否则{
最终[k][m[1]]=v.值;
}
});
console.log(最终版);
请检查此项

let arr=[] //your array
let map=new Map();
arr.forEach((obj)=>{
let x=obj.name.split('_');
map.set(x[2],{"name":x[2],...map.get(x[2]),[x[1]]:obj.value})
}
);
console.log([...map.values()]);

如果您需要,可以随意使用我的repl。

也许一个循环比使用regex创建一个新对象更有帮助,但我不确定以前是否见过

var rawData=[{“name”:“total_kills_glock”,“value”:70},{“name”:“total_kills_mac10”,“value”:39},{“name”:“total_kills_ump45”,“value”:136},{“name”:“total_shots_glock”,“value”:1262},{“name”:“total_hits_glock”,“value”:361},{“name”:“total_hits_mac10”,“value”:862},{“name”:“total_hits_mac10”,“value”:261;,{“name”:“total_shots_ump45”,“value”:1610},{“name”:“total_hits_ump45”,“value”:598}];
var gunStats=[{
“姓名”:“格洛克”,
“杀死”:0,
“快照”:0,
“点击数”:0
},
{
“名称”:“mac10”,
“杀死”:0,
“快照”:0,
“点击数”:0
},
{
“名称”:“ump45”,
“杀死”:0,
“快照”:0,
“点击数”:0
}
];
rawData.forEach((项)=>{
if(项目名称包括(“glock”)){
applyStatsToGun(项目“glock”);
}
if(项目名称包括(“mac10”)){
applyStatsToGun(项目“mac10”);
}
if(项目名称包括(“ump45”)){
applyStatsToGun(项目“ump45”);
}
});
功能applyStatsToGun(项目,gunName){
if(项目名称包括(gunName)){
if(项目名称包括(“终止”)){
var gun=gunStats.find((gun)=>gun.name==gunName);
gun.kills+=item.value;
}
if(项目名称包括(“快照”)){
var gun=gunStats.find((gun)=>gun.name==gunName);
gun.shots+=item.value;
}
if(项目名称包括(“点击”)){
var gun=gunStats.find((gun)=>gun.name==gunName);
gun.hits+=item.value;
}
}
}

下面的console.log(gunStats);
是一个纯功能解决方案,它结合了一些有用的技术。请注意,您可以在代码中的其他地方重用部分函数。此外,通过这种方式,计算可以并行化和分布(尽管JavaScript还没有)

let raw=[
{“name”:“total_kills_glock”,“value”:70},
{“name”:“total_kills_mac10”,“value”:39},
{“name”:“total_kills_ump45”,“value”:136},
{“name”:“total_shots_glock”,“value”:1262},
{“name”:“total_hits_glock”,“value”:361},
{“name”:“total_shots_mac10”,“value”:862},
{“name”:“total_hits_mac10”,“value”:261},
{“name”:“total_shots_ump45”,“value”:1610},
{“name”:“total_hits_ump45”,“value”:598}
];
//您可以在这里使用任何解析技术,包括regexp
const parse=name=>{
常量a=名称。拆分(“”);
返回{key:a[2],metric:a[1]}
};
constgroupby=getKey=>(rv,x)=>{
(rv[getKey(x)]=rv[getKey(x)]| |[])。按下(x);
返回rv;
};
//将[{key,metric,value},…]转换为{name:key,m1:v1,m2:v2,…}
const recombine=arr=>Object.assign({name:arr[0].key},
…数组.from(arr,({key,metric,value})=>({[metric]:value}));
const groupedByKey=raw
.map(({name,…attrs})=>({…parse(name),…attrs}))
.reduce(groupBy(x=>x.key),{});
const result=Object.values(groupedByKey).map(重新组合);

console.log(result);
您可以拆分字符串并对项目进行分解,并将一个对象作为同一组的哈希表。最后从哈希表中获取值

var data=[{name:“total_kills_glock”,value:70},{name:“total_kills_mac10”,value:39},{name:“total_kills_ump45”,value:136},{name:“total_shots_glock”,value:1262},{name:“total_hits_glock”,value:361},{name:“total_shots_mac10”,value:862},{name:“total_hits_shots_mac10”,value:261; name:“total},{“,值:1610},{name:“total_hits_ump45”,值: