2

Below is my one combined object:

{
      "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
   }

Expected Output:

      {
        "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
          }
        ]
      }

Can anyone please help me for this? I tried many things but didn't help. I tried this answer: SO

17
  • 1
    Your combined object isn't an object. Can you please provide a valid input to work with? Commented Jun 27, 2019 at 10:20
  • Can you please explain what you want? @briosheje Commented Jun 27, 2019 at 10:22
  • A valid object. "points-0"medals:2020, is not a valid syntax neither for an object, nor for a JSON string. Same with: "levelId-2":3['']. I'm assuming the object is coming from something. If so, please just log it and put it here, or JSON.stringify it so that it would be even easier to acquire it ;) Commented Jun 27, 2019 at 10:23
  • @briosheje Oh.. Let me edit it.. Commented Jun 27, 2019 at 10:23
  • Your object is illegal: ex.: "points-0"medals:2020 Commented Jun 27, 2019 at 10:25

5 Answers 5

1

You could get the key of the outer objects and split the key of the given data for a property and an index for assignment.

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; }

Sign up to request clarification or add additional context in comments.

2 Comments

Hey, thanks for the help. One question: If I want to add one more object then can I add here: ['Level', 'Medal'] like ['Level', 'Medal', 'TempObj']?
yes, if the key contains this word ... (actually i am not happy with this, but i couldn't find a better solution, because there is no separator for the outer group in the keys.)
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),{}));

Comments

1

Here is a quick solution to your issue. Hope that solves your problem.

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)

Comments

1

try this

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
}

Comments

1

I dont think the expected output you have written is the correct one. According to me the expected output should be:

{
  "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
    }
  ]
}

And the code for getting such output is:

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);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.