我有一个如下所示的数组,
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'] }
]
如果你找到了一个有效的解决方案,我自己就会明白这个想法。我试着自己完成这个工作。
答案 0 :(得分:2)
此提议使用两个嵌套循环和一个对象来引用结果数组的右元素。
var 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' }],
pivot = function (array) {
var r = [], o = {};
array.forEach(function (a) {
[].concat(a.mm).forEach(function (b) {
if (!o[b]) {
o[b] = { mm: b, exp: [] };
r.push(o[b]);
}
o[b].exp.push(a.exp);
});
});
return r;
}(array);
document.write('<pre>' + JSON.stringify(pivot, 0, 4) + '</pre>');
答案 1 :(得分:1)
我真的不明白你的意思是'不能对任何值进行硬编码',但我认为无论如何我都会分享一个示例解决方案。我没有真正优化它的性能:它主要是为了显示一个大方向。
var data =[
{ '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(function(dataPoint) {
var arrPoint = {
mm: [].concat(dataPoint.mm),
exp: [].concat(dataPoint.exp)
};
arrPoint.mm.forEach(function (code) {
if (!tempData[code]) {
tempData[code] = {
mm: code,
exp: []
}
}
var vals = tempData[code].exp;
arrPoint.exp.forEach(function(val) {
if (vals.indexOf(val) === -1) {
vals.push(val);
}
});
});
});
for (var propName in tempData) {
if (tempData.hasOwnProperty(propName)) {
newData.push(tempData[propName]);
}
}
document.write(JSON.stringify(newData));
下次,在你问之前,最好先尝试自己。这样,你的问题可能会有点宽泛......