用Javascript重新格式化JSON数据的优雅、简洁的方法?

用Javascript重新格式化JSON数据的优雅、简洁的方法?,javascript,json,javascript-objects,reformatting,Javascript,Json,Javascript Objects,Reformatting,我从一个旧的数据库查询中收到一条JSON结果消息,该消息的格式如下,我目前无法更改: { "vsm1": "2429", "vsm2": "2488", "vsm3": "1968", "vsm4": "", "vsm5": "", "vsm6": "", "vsm7": "", "vsm8": "", "vsm9": "", "vsm10": "", "color1": "5", "color2": "4", "color3": "4",

我从一个旧的数据库查询中收到一条JSON结果消息,该消息的格式如下,我目前无法更改:

{
  "vsm1": "2429",
  "vsm2": "2488",
  "vsm3": "1968",
  "vsm4": "",
  "vsm5": "",
  "vsm6": "",
  "vsm7": "",
  "vsm8": "",
  "vsm9": "",
  "vsm10": "",
  "color1": "5",
  "color2": "4",
  "color3": "4",
  "color4": "0",
  "color5": "0",
  "color6": "0",
  "color7": "0",
  "color8": "0",
  "color9": "0", 
  "color10": "0",
  "p1mtime": "1549296004",
  "p2mtime": "1549296009",
  "p3mtime": "1549296014",
  "p4mtime": "",
  "p5mtime": "",
  "p6mtime": "",
  "p7mtime": "",
  "p8mtime": "",
  "p9mtime": "",
  "p10mtime": "",
  "inch1": "",
  "inch2": "",
  "inch3": "",
  "inch4": "",
  "inch5": "",
  "inch6": "",
  "inch7": "",
  "inch8": "",
  "inch9": "",
  "inch10": "" 
}

我想将其重新格式化为更有用的对象,如下所示:

{ id: 1, vsm: 2429, color: 5, pmtime: 1549296004, inch: 0  }
{ id: 2, vsm: 2488, color: 4, pmtime: 1549296009, inch: 0  }
{ id: 3, vsm: 1968, color: 4, pmtime: 1549296014, inch: 0  }
……等等

当前传入的数据仅限于每个“部分”(vsm1、vsm2、…vsm10、color1、color2、…color10等)中的十个元素,因此我是如何开始在每个部分中的十个元素上进行某种静态循环的,但看起来相当丑陋,而且肯定不灵活

如果数据超过10个元素,或者下降到3个元素(由于缺少数据或删减数据),那么处理每个部分中n个元素的智能代码段就更好了


我正在考虑使用.forEach(),但无可否认,我的JSON/对象操作技能相当差,因此我求助于社区,希望有人能为我指明正确的方向,或者知道一个很酷、很紧凑的例程/函数,以实现我所寻找的目标。提前感谢您提供的任何见解。

您可以获取一个带有占位符的通缉密钥数组,然后构建新对象并将其推送到结果集

var数据={vsm1:“2429”,vsm2:“2488”,vsm3:“1968”,vsm4:,vsm5:,vsm6:,vsm7:,vsm8:,vsm9:,vsm10:,color1:“5”,color2:“4”,color3:“4”,color4:“0”,color5:“0”,color6:“0”,color9:“0”,color10:“0”,p1mtime:“1549296004”,p2mtime:“1549296009”,p3mtime:“1549296014”,mtime:”,p5mtime:,p6mtime:,p7mtime:,p8mtime:,p9mtime:,p10mtime:,inch1:,inch2:,inch3:,inch4:,inch5:,inch6:,inch7:,inch8:,inch9:,inch10:,
按键=['vsm*'、'color*'、'p*mtime'、'inch*'],
结果=[],
id=1;
while(键[0]。替换数据中的('*',id){
结果。推送(Object.assign(
{id},
…keys.map(k=>({[k.replace('*',''):+data[k.replace('*',id)]| | 0}))
));
id++;
}
控制台日志(结果)

.as console wrapper{max height:100%!important;top:0;}
尝试此操作,使用oldObject要清理的对象:

var cleanedObject = {};
for (let [key, value] of Object.entries(oldObject)) {
  let index = key.match('[0-9]+');
  cleanedObject[index] = cleanedObject[index] || {};
  cleanedObject[index][key.replace(index, '')] = value;
}

结果将是一个对象,
cleanedObject['1']={vsm:2429,颜色:5,pmtime:1549296004,英寸:'}
,依此类推。

此解决方案与Nina Sholz的解决方案具有不同的灵活性。Nina's允许您匹配任何类型的包含键的数字。但它也要求您添加一个模板,以便这样做。我的将处理任何只包含一行数字但没有更复杂的键。但它不需要您做任何事情来处理这些模板

const-reformat=data=>Object.values(Object.keys(data)
.减少(
(a,k,i,ud=k.match(/\d+/)[0])=>({
A.
[d] :{…(a[d]|{id:Number(d)}),[k.replace(/\d+/,''):数据[k]}
})排序((a,b)=>a.id-b.id)
常量数据={“vsm1”:“2429”,“vsm2”:“2488”,“vsm3”:“1968”,“vsm4”:“vsm5”:“vsm6”:“vsm7”:“vsm8”:“vsm9”:“vsm10”:“color1”:“5”,“color2”:“4”,“color3”:“4”,“color4”:“0”,“color5”:“0”,“color6”:“0”,“color7”:“0”,“color8”:“0”,“color9”:“0”,“color10”:“0”,“p1mtime”:“1549296004”,“MTIME”:“1549209”,“P3P496014”“MTP5929”:“MTIME”:“,”p6mtime:“,”p7mtime:“,”p8mtime:“,”p9mtime:“,”p10mtime:“,”inch1:“,”inch2:“,”inch3:“,”inch4:“,”inch5:“,”inch6:“,”inch7:“,”inch8:“,”inch9:“,”inch10:”)

log(重新格式化(数据))
我现在看到我的答案与Ninas基本相同,以前没有见过模板,所以这很酷,但鉴于这一点,我第一次尝试在这里回答一些问题,我还是会分享它

正如Ninas一样,它可以处理任意长度的数据

const data={“vsm1”:“2429”,
“vsm2”:“2488”,
“vsm3”:“1968年”,
“vsm4”:“,
“颜色1”:“5”,
“颜色2”:“4”,
“颜色3”:“4”,
“颜色4”:“0”,
“p1mtime”:“1549296004”,
“p2mtime”:“1549296009”,
“p3mtime”:“1549296014”,
“p4mtime”:“,
“inch1”:“1”,
“第2条”:“第2条”,
“第3条”:“第3条”,
“第4条”:“第4条”,
};
const vsmRegex=newregexp(“(vsm\\d)”);
常量键=对象键(数据);
常量结果=[];
设id=1;
for(设i=0;i控制台日志(结果)
这是一个很好的开始,但最好将这些ID折叠到对象中,然后使用
object.values
提取OP正在查找的内容。然后您可能需要对结果进行排序。正确-我希望从键中提取数字(JasonR这样做),然后将其作为“记录”id的一部分重新使用。排序很好,但不是一项要求,因为此解析代码在节点服务器端运行,客户端可以选择是根据id还是颜色进行排序(它们表示映射到颜色方案的“优先级”),甚至是时间戳。我仍然很感谢您的输入,JasonR!谢谢。这一个只是比Nina的略胜一筹-从未尝试过模板,但对我来说很有趣-但不喜欢结果集作为所有字符串。只需要一个简单的“key name:number”布局,这样我就可以按原样解析和计算值,而无需转换t回到数字。我想我可以简单地通过将整个混乱转换成一个字符串,撕下“s,然后将其解析回JSON。感谢所有人的评论!睡个好觉后,将选择一个赢家。输出是字符串,因为输入是字符串。如果您不介意将空字符串转换为零,那么您可以将
data[K]
替换为
Number(data[K])
,并获取所有信息的编号。此外,如果