Voici mon objet combiné:
{
"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
}
]
}
Résultat attendu:
{
"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
}
Quelqu'un peut-il m'aider s'il vous plaît? J'ai essayé beaucoup de choses mais je n'ai pas aidé. J'ai essayé cette réponse: SO a>
5 Réponses :
Vous pouvez obtenir la clé des objets externes et diviser la clé des données données pour une propriété et un index pour l'affectation.
.as-console-wrapper { max-height: 100% !important; top: 0; }
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);
Hé, merci pour l'aide. Une question: si je veux ajouter un objet de plus, puis-je ajouter ici: ['Level', 'Medal'] comme ['Level', 'Medal', 'TempObj']?
oui, si la clé contient ce mot ... (en fait, je ne suis pas satisfait de cela, mais je n'ai pas pu trouver de meilleure solution, car il n'y a pas de séparateur pour le groupe externe dans les clés.)
Je ne pense pas que la sortie attendue que vous avez écrite soit la bonne. Selon moi, la sortie attendue devrait être:
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);
Et le code pour obtenir une telle sortie est:
{
"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 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),{}));
Voici une solution rapide à votre problème. J'espère que cela résout votre problème.
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)
essayez ceci
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
}
Votre objet combiné n'est pas un objet. Pouvez-vous s'il vous plaît fournir une entrée valide pour travailler avec?
Pouvez-vous expliquer ce que vous voulez? @briosheje
Un objet valide.
médailles "points-0": 2020,n'est pas une syntaxe valide ni pour un objet, ni pour une chaîne JSON. Idem avec:"levelId-2": 3 ['']. Je suppose que l'objet vient de quelque chose. Si tel est le cas, veuillez simplement le connecter et le mettre ici, ouJSON.stringifyafin qu'il soit encore plus facile de l'acquérir;)@briosheje Oh .. Laissez-moi le modifier ..
Votre objet est illégal: ex .: médailles "points-0": 2020
@ ZivBen-Ou je le modifie
@briosheje veuillez vérifier maintenant.
@PathikVejani malheureusement, ceci n'est toujours pas valide:
"levelpoints-0",. Question secondaire: avez-vous besoin de regrouper automatiquement par ou pouvez-vous fournir les clés souhaitées? la détection de clés de groupe dans un format d'entrée aussi laid est en fait légèrement complexe en raison de l'incohérence des clés.@briosheje oui grouper automatiquement par .. Je suis en train de modifier la question ..
veuillez créer un jsfiddle ou plus, éditera et enverra une solution
@briosheje Techniquement, ce n'est pas invalide - vous pouvez y accéder via la notation entre crochets
obj ["levelpoints-0"]. Notez également que les traits d'union sont intégrés aux objets JS natifs, par ex.Content-Typedans l'API Fetch."levelpoints-0", n'est pas valide ...
@NeerajKamat le voici: jsfiddle.net/pathik2012/a5cj21z0/1
@briosheje jsfiddle.net/pathik2012/a5cj21z0/1
@briosheje une chance?
@PathikVejani voici une solution jsfiddle.net/yd7Lgab6/14
merci d'avoir posé la question !!!