Easiest way to interate over a complex JSON object via Javascript

后端 未结 7 1863
生来不讨喜
生来不讨喜 2020-12-21 07:19

I\'m consuming JSON data that has a bit of a weird structure for example:

{
    \"RESULT\": 
    {
        \"COLUMNS\": [\"ID\",\"name\",\"ENABLED\",\"perms\         


        
相关标签:
7条回答
  • 2020-12-21 07:47

    newjson is your new object, j is your json,

    code is very fast as it caches the legth and don't uses push.

    And as it's pure javascript it's faster than all the libraries.

    var j={
     "RESULT":{
      "COLUMNS":[
       "ID",
       "name",
       "ENABLED",
       "perms",
       "vcenabled",
       "vcvalue",
       "checkenabled",
       "checkvalue",
       "indxenabled",
       "indxvalue"
      ],
      "DATA":[
       [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0],
       [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0]
      ]
     },
     "ERROR": 0
    }
    
    var newjson=[],d=j.RESULT.COLUMNS.length;
    for(var a=0,b=j.RESULT.DATA.length;a<b;a++){
     for(var c=0,tmpObj={};c<d;c++){
      tmpObj[j.RESULT.COLUMNS[c]]=j.RESULT.DATA[a][c];
     }
     newjson[a]=tmpObj;
    }
    
    console.log(newjson);
    

    based on Bergi's response u can also use the while-- loop.

    var orig={
     "RESULT":{
      "COLUMNS":[
       "ID",
       "name",
       "ENABLED",
       "perms",
       "vcenabled",
       "vcvalue",
       "checkenabled",
       "checkvalue",
       "indxenabled",
       "indxvalue"
      ],
      "DATA":[
       [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0],
       [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0]
      ]
     },
     "ERROR": 0
    }
    
    var formatted = [],
    data = orig.RESULT.DATA,
    cols = orig.RESULT.COLUMNS,
    l = cols.length,
    f = data.length;
    
    while (f--) {
      var d = data[f],
          o = {},
          g = l;
      while (g--) {
        o[cols[g]] = d[g];
      }
      formatted[f] = o;
    }
    
    0 讨论(0)
  • 2020-12-21 07:54

    Using JQuery:

    function jsonToObj(json){
       return jQuery.parseJSON(JSON.stringify(json));
    }
    

    For example, after a GET request the server send a complex object

      $.get("/Files/-2", function (rxData, status) {
    
          var obj = jsonToObj(rxData);
          console.log(obj);
      });
    

    Logged in console, can be explored through Chrome's Web Developer (F12), in my case looks like this:

    image showing nested levels

    0 讨论(0)
  • 2020-12-21 07:55

    By simple JS, your solution would look like this:

    var yourObj = {
      "RESULT": {
        "COLUMNS": ["ID","name","ENABLED","perms","vcenabled","vcvalue","checkenabled","checkvalue","indxenabled","indxvalue"],
        "DATA": [
          [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0],
          [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0]
        ]
      },
      "ERROR": 0
    }
    
    //Solution
    
    var finalARR = [];
    
    var colLength = yourObj.RESULT.COLUMNS.length;
    var dataLength = yourObj.RESULT.DATA.length;
    
    for (var i = 0; i < dataLength; i++) {
      var finalJSON = {};
      for (var j = 0; j < colLength; j++) {
        finalJSON[yourObj.RESULT.COLUMNS[j]] = yourObj.RESULT.DATA[i][j];
      }
      finalARR[i] = finalJSON;
    }
    
    console.log(finalARR);

    0 讨论(0)
  • 2020-12-21 08:01

    Try this using underscorejs.

    var plain = {
        "RESULT": 
        {
            "COLUMNS": ["ID","name","ENABLED","perms","vcenabled","vcvalue","checkenabled","checkvalue","indxenabled","indxvalue"],
            "DATA": [
                    [7,"Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0],
                    [15,"Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0]
            ]
        },
        "ERROR": 0
    }
       , formatted = [];
    
    _.each(plain.RESULT.DATA, function(value) {
        var tmp = {};
        _.each(value, function(parameter, pos) {
            tmp[plain.RESULT.COLUMNS[pos]] = parameter;
        });
        formatted.push(tmp);
    });
    
    console.log(formatted);
    

    http://jsfiddle.net/kxR88/

    0 讨论(0)
  • 2020-12-21 08:08

    Using Underscore, it's a one-liner:

    var formatted = _.map(orig.RESULT.DATA, _.partial(_.object, orig.RESULT.COLUMNS));
    

    With plain javascript (less elegant but faster), it would be

    var formatted = [],
        data = orig.RESULT.DATA,
        cols = orig.RESULT.COLUMNS,
        l = cols.length;
    for (var i=0; i<data.length; i++) {
        var d = data[i],
            o = {};
        for (var j=0; j<l; j++)
            o[cols[j]] = d[j];
        formatted.push(o);
    }
    
    0 讨论(0)
  • 2020-12-21 08:08

    Actually, you could use a combination of Array#map for the array and Array#reduce for the objects with the new properties

    var data = { RESULT: { COLUMNS: ["ID", "name", "ENABLED", "perms", "vcenabled", "vcvalue", "checkenabled", "checkvalue", "indxenabled", "indxvalue"], DATA: [[7, "Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15, "Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0]] }, ERROR: 0 },
        result = data.RESULT.DATA.map(function (a) {
            return a.reduce(function (o, d, i) {
                o[data.RESULT.COLUMNS[i]] = d;
                return o;
            }, {});
        });
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    With ES6, you could use Object.assign with spread syntax ....

    Object.assign adds properties to the given object and returns this object.

    Spread syntax ... takes an array and insert the elements as parameters to the function.

    var data = { RESULT: { COLUMNS: ["ID", "name", "ENABLED", "perms", "vcenabled", "vcvalue", "checkenabled", "checkvalue", "indxenabled", "indxvalue"], DATA: [[7, "Site-A", 1, "1,2", 1, 1, 1, 0, 0, 0], [15, "Site-B", 1, "1,2,3,4", 1, 1, 1, 0, 0, 0]] }, ERROR: 0 },
        result = data.RESULT.DATA.map(a =>
            Object.assign(...data.RESULT.COLUMNS.map((k, i) => ({ [k]: a[i] }))));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    0 讨论(0)
提交回复
热议问题