根据键和值将对象修改为单独的对象

时间:2019-06-27 10:20:24

标签: javascript typescript loops

下面是我的一个组合对象:

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

5 个答案:

答案 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
}