Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析并构造一个复杂的json_Javascript_Arrays_Json_Parsing_Nested - Fatal编程技术网

Javascript 解析并构造一个复杂的json

Javascript 解析并构造一个复杂的json,javascript,arrays,json,parsing,nested,Javascript,Arrays,Json,Parsing,Nested,我有一个如下的数组 array=[ { 'mm': '1', exp: 'exp1' }, { 'mm': '2', exp: 'exp2' }, { 'mm': [ '1', '3', '7' ], exp: 'exp3' }, { 'mm': [ '1', '2', '4', '6' ], exp: 'exp4' }, { 'mm': [ '1', '3', '2' ], exp: 'exp5' }, { 'mm': [ '8', '2', '9' ], exp:

我有一个如下的数组

array=[ 
  { 'mm': '1', exp: 'exp1' },
  { 'mm': '2', exp: 'exp2' },
  { 'mm': [ '1', '3', '7' ], exp: 'exp3' },
  { 'mm': [ '1', '2', '4', '6' ], exp: 'exp4' },
  { 'mm': [ '1', '3', '2' ], exp: 'exp5' },
  { 'mm': [ '8', '2', '9' ], exp: 'exp6' },
  { 'mm': [ '4', '7', '1', '2' ], exp: 'exp7' },
  { 'mm': [ '5', '6', '2', '4', '3', '8', '1' ], exp: 'exp8' } 
]
我需要重新构造这个数组(将键转换为值,将值转换为键),如下所示(不能硬编码'mm'或'exp'键中的任何值,因为它们总是在变化

    [ 
      { 'mm': '1', exp: ['exp1','exp3','exp4',','exp5','exp7','exp8'] },
      { 'mm': '2', exp: ['exp2','exp4','exp5','exp6','exp7','exp8'] },
      { 'mm': '3', exp: ['exp3','exp5','exp8'] },
      { 'mm':'4', exp:['exp4','exp7','exp8'] },
      { 'mm':'5', exp:['exp8'] },
      { 'mm':'6', exp:['exp4','exp8'] },
      { 'mm':'7', exp: ['exp3','exp7'] },
      { 'mm':'8', exp: ['exp6','exp8] },
      { 'mm':'9', exp: ['exp6'] }
] 

希望你能明白这个想法,让我知道你是否找到了一个有效的解决方案,而我自己也在努力完成这项工作。

我真的不明白你所说的“不能硬编码任何值”是什么意思,但我想我还是要分享一个示例解决方案。我并没有真正为性能优化它:它主要是为了显示一个大致的方向

var数据=[
{'mm':'1',exp:'exp1'},
{'mm':'2',exp:'exp2'},
{'mm':['1','3','7'],exp:'exp3'},
{'mm':['1','2','4','6'],exp:'exp4'},
{'mm':['1','3','2'],exp:'exp5'},
{'mm':['8','2','9'],exp:'exp6'},
{'mm':['4','7','1','2'],exp:'exp7'},
{'mm':['5','6','2','4','3','8','1'],exp:'exp8'}
];
var tempData={};
var newData=[];
data.forEach(函数(数据点){
var arrPoint={
mm:[].concat(dataPoint.mm),
exp:[].concat(dataPoint.exp)
};
arrPoint.mm.forEach(函数(代码){
如果(!tempData[code]){
tempData[代码]={
mm:代码,
经验:[]
}
}
var vals=tempData[code].exp;
arrPoint.exp.forEach(函数(val){
如果(val.indexOf(val)=-1){
推力(val);
}
});
});
});
for(tempData中的变量propName){
if(tempData.hasOwnProperty(propName)){
push(tempData[propName]);
}
}

document.write(JSON.stringify(newData));
我真的不明白你所说的“不能硬编码任何值”是什么意思,但我想我还是要分享一个示例解决方案。我并没有真正优化它的性能:它主要是显示一个总体方向

var数据=[
{'mm':'1',exp:'exp1'},
{'mm':'2',exp:'exp2'},
{'mm':['1','3','7'],exp:'exp3'},
{'mm':['1','2','4','6'],exp:'exp4'},
{'mm':['1','3','2'],exp:'exp5'},
{'mm':['8','2','9'],exp:'exp6'},
{'mm':['4','7','1','2'],exp:'exp7'},
{'mm':['5','6','2','4','3','8','1'],exp:'exp8'}
];
var tempData={};
var newData=[];
data.forEach(函数(数据点){
var arrPoint={
mm:[].concat(dataPoint.mm),
exp:[].concat(dataPoint.exp)
};
arrPoint.mm.forEach(函数(代码){
如果(!tempData[code]){
tempData[代码]={
mm:代码,
经验:[]
}
}
var vals=tempData[code].exp;
arrPoint.exp.forEach(函数(val){
如果(val.indexOf(val)=-1){
推力(val);
}
});
});
});
for(tempData中的变量propName){
if(tempData.hasOwnProperty(propName)){
push(tempData[propName]);
}
}

document.write(JSON.stringify(newData));
此方案使用两个嵌套循环和一个对象作为对结果数组右侧元素的引用。
var数组=[{'mm':'1',exp:'exp1'},{'mm':'2',exp:'exp2'},{'mm':['1','3','7'],exp:'exp3'},{'mm':['1','2','4','6'],exp:'exp4'},{'mm':['1','3','2'],exp exp 5'},{'mm':['8','2','9'],exp:'mm':['4','7','7','1','2'],exp:'8',',
pivot=函数(数组){
var r=[],o={};
array.forEach(函数(a){
[].concat(a.mm).forEach(函数(b){
如果(!o[b]){
o[b]={mm:b,exp:[]};
r、 推(o[b]);
}
o[b].exp.push(a.exp);
});
});
返回r;
}(阵列);

document.write(''+JSON.stringify(pivot,0,4)+'');
此方案使用两个嵌套循环和一个对象作为对结果数组右侧元素的引用。
var数组=[{'mm':'1',exp:'exp1'},{'mm':'2',exp:'exp2'},{'mm':['1','3','7'],exp:'exp3'},{'mm':['1','2','4','6'],exp:'exp4'},{'mm':['1','3','2'],exp exp 5'},{'mm':['8','2','9'],exp:'mm':['4','7','7','1','2'],exp:'8',',
pivot=函数(数组){
var r=[],o={};
array.forEach(函数(a){
[].concat(a.mm).forEach(函数(b){
如果(!o[b]){
o[b]={mm:b,exp:[]};
r、 推(o[b]);
}
o[b].exp.push(a.exp);
});
});
返回r;
}(阵列);

document.write(“”+JSON.stringify(pivot,0,4)+“”)
谢谢你的建议。我试图在一个循环周期内创建此方法以提高性能。但再次感谢你。不客气!这是一个很好的挑战,看看你是否可以在一个循环中完成。但一定要检查它是否真的值得。我想你可以使用此方法作为“最慢方式”的基准。重写看能快多少:)谢谢你的建议。我试图在一个循环周期内创建它,以提高性能。但再次感谢你,不客气!这是一个很好的挑战,看看你是否能在一个循环中完成。。但一定要检查它是否真的值得。我想你可以用这个方法作为“最慢的方法”的基准。重写它,看看它能快多少:)