下面是我的一个组合对象:
{
"levelId-0":1,
"level-0":"1",
"levelpoints-0": 15,
"levelId-1":2,
"level-1":"2",
"levelpoints-1": 15,
"levelId-2":3,
"level-2":"3",
"levelpoints-2": 15,
"levelId-3":4,
"level-3":"4",
"levelpoints-3": 15,
"medalId-0":1,
"medalName-0":"Bronze",
"medalsPoint-0":2020,
"medalId-1":2,
"medalName-1":"Silver",
"medalsPoint-1":10,
"medalId-2":3,
"medalName-2":"Gold",
"medalsPoint-2":10,
"medalId-3":1003,
"medalName-3":"Platinum",
"medalsPoint-3":85
}
预期输出:
{
"Level":[
{
"levelId":1,
"level":"1",
"points":2020
},
{
"levelId":2,
"level":"2",
"points":1000
}
],
"Medal":[
{
"medalId":1,
"medalName":"Bronze",
"points":2020
},
{
"medalId":3,
"medalName":"Gold",
"points":1000
}
]
}
有人可以帮我吗?我尝试了很多事情,但没有帮助。 我尝试了以下答案:SO
答案 0 :(得分:1)
您可以获取外部对象的键,并将给定数据的键拆分为一个属性和一个索引以进行分配。
var data = { "levelId-0": 1, "level-0": "1", "levelpoints-0": 15, "levelId-1": 2, "level-1": "2", "levelpoints-1": 15, "levelId-2": 3, "level-2": "3", "levelpoints-2": 15, "levelId-3": 4, "level-3": "4", "levelpoints-3": 15, "medalId-0": 1, "medalName-0": "Bronze", "medalsPoint-0": 2020, "medalId-1": 2, "medalName-1": "Silver", "medalsPoint-1": 10, "medalId-2": 3, "medalName-2": "Gold", "medalsPoint-2": 10, "medalId-3": 1003, "medalName-3": "Platinum", "medalsPoint-3": 85 },
result = Object.entries(data).reduce((o, [k, v]) => {
var key = ['Level', 'Medal'].find(s => k.includes(s.toLowerCase())),
[prop, index] = k.split('-');
o[key] = o[key] || [];
o[key][index] = o[key][index] || {};
o[key][index][prop] = v;
return o;
}, {});
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:1)
我不认为您编写的预期输出是正确的。据我估计,预期输出应为:
{
"Level": [
{
"levelId": 1,
"level": "1",
"points": 15
},
{
"levelId": 2,
"level": "2",
"points": 15
},
{
"levelId": 3,
"level": "3",
"points": 15
}
],
"Medal": [
{
"medalId": 1,
"medalName": "Bronze",
"points": 2020
},
{
"medalId": 2,
"medalName": "Silver",
"points": 10
},
{
"medalId": 3,
"medalName": "Gold",
"points": 10
}
]
}
获得这种输出的代码是:
var abc = {
"levelId-0": 1,
"level-0": "1",
"levelpoints-0": 15,
"levelId-1": 2,
"level-1": "2",
"levelpoints-1": 15,
"levelId-2": 3,
"level-2": "3",
"levelpoints-2": 15,
"levelId-3": 4,
"level-3": "4",
"levelpoints-3": 15,
"medalId-0": 1,
"medalName-0": "Bronze",
"medalsPoint-0": 2020,
"medalId-1": 2,
"medalName-1": "Silver",
"medalsPoint-1": 10,
"medalId-2": 3,
"medalName-2": "Gold",
"medalsPoint-2": 10,
"medalId-3": 1003,
"medalName-3": "Platinum",
"medalsPoint-3": 85
};
var final = {
"Level": [],
"Medal": []
};
let abcKeys = Object.keys(abc);
var lastRowIndex = parseInt(abcKeys[abcKeys.length - 1].split('-')[1]); //3
for (let i = 0; i < lastRowIndex; i++) {
let levelObj = {}, medalObj = {};
levelObj['levelId'] = abc['levelId-' + i];
levelObj['level'] = abc['level-' + i];
levelObj['points'] = abc['levelpoints-' + i];
medalObj['medalId'] = abc['medalId-' + i];
medalObj['medalName'] = abc['medalName-' + i];
medalObj['points'] = abc['medalsPoint-' + i];
final.Level.push(levelObj);
final.Medal.push(medalObj);
}
console.log('--final--', final);
答案 2 :(得分:1)
var data = {
"levelId-0": 1,
"level-0": "1",
"levelpoints-0": 15,
"levelId-1": 2,
"level-1": "2",
"levelpoints-1": 15,
"levelId-2": 3,
"level-2": "3",
"levelpoints-2": 15,
"levelId-3": 4,
"level-3": "4",
"levelpoints-3": 15,
"medalId-0": 1,
"medalName-0": "Bronze",
"medalsPoint-0": 2020,
"medalId-1": 2,
"medalName-1": "Silver",
"medalsPoint-1": 10,
"medalId-2": 3,
"medalName-2": "Gold",
"medalsPoint-2": 10,
"medalId-3": 1003,
"medalName-3": "Platinum",
"medalsPoint-3": 85
};
console.log(Object.entries(
Object.keys(data).reduce(
(p, key) => {
let group = key.slice(-1);
key.startsWith("level") && ((p["level"][group] = p["level"][group] || {})[key] = data[key]);
key.startsWith("medal") && ((p["medal"][group] = p["medal"][group] || {})[key] = data[key]);
return p;
},
{ level: {}, medal: {} }
)
).reduce((p, item) => (p[item[0]] = Object.values(item[1]),p),{}));
答案 3 :(得分:1)
这是您问题的快速解决方案。希望能解决您的问题。
var obj = {
"levelId-0":1,
"level-0":"1",
"levelpoints-0": 15,
"levelId-1":2,
"level-1":"2",
"levelpoints-1": 15,
"levelId-2":3,
"level-2":"3",
"levelpoints-2": 15,
"levelId-3":4,
"level-3":"4",
"levelpoints-3": 15,
"medalId-0":1,
"medalName-0":"Bronze",
"medalsPoint-0":2020,
"medalId-1":2,
"medalName-1":"Silver",
"medalsPoint-1":10,
"medalId-2":3,
"medalName-2":"Gold",
"medalsPoint-2":10,
"medalId-3":1003,
"medalName-3":"Platinum",
"medalsPoint-3":85
}
var yourObj = {
"level":[],
"medal":[]
}
var values =[];
for (key in obj){
var keyval = key.split('-')
if(!values[keyval[1]]){
values[keyval[1]] =[]
}
values[keyval[1]].push(keyval)
}
for (i =0;i<values.length;i++){
var tempLevelObj = {
"levelId":"",
"level":"",
"points":""
};
var tempMedalObj = {
"medalId":"",
"medalName":"",
"points":""
}
for(j=0;j<values[i].length;j++){
var joinVal = values[i][j].join('-')
switch(values[i][j][0]){
case 'levelId' :tempLevelObj.levelId = obj[joinVal] ;break
case 'level' : tempLevelObj.level = obj[joinVal] ;break
case 'levelpoints' :tempLevelObj.points = obj[joinVal] ;break
case 'medalId' :tempMedalObj.medalId = obj[joinVal] ;break
case 'medalName' :tempMedalObj.medalName = obj[joinVal] ;break
case 'medalsPoint' :tempMedalObj.points = obj[joinVal] ;break
}
}
yourObj.level.push(tempLevelObj)
yourObj.medal.push(tempMedalObj)
}
console.log(yourObj)
答案 4 :(得分:1)
尝试
function consoleNewJson() {
function updateJson(aliases, pathName, value) {
aliases.set(pathName, value);
}
var map = new Map(),
newJson = {};
// you have to loop here for your requirement
updateJson(map, 'level.levelId', 1);
updateJson(map, 'level.level', '1');
updateJson(map, 'level.points', '15');
map.forEach((value, key) => {
var keys = key.split('.'),
last = keys.pop();
keys.reduce((r, a) => r[a] = r[a] || {}, newJson)[last] = value;
});
console.log(newJson);
// you can also return the json
}