0

I was wondering how I could turn this:

var data = [  
     {id:1,option1:'short',option2:'red',option3:'gold'},  
     {id:2,option1:'short',option2:'red',option3:'silver'},   
     {id:3,option1:'short',option2:'blue',option3:'gold'},  
     {id:4,option1:'short',option2:'blue',option3:'silver'},  
     {id:5,option1:'long',option2:'red',option3:'gold'},  
     {id:6,option1:'long',option2:'red',option3:'silver'},   
     {id:7,option1:'long',option2:'blue',option3:'gold'},  
     {id:8,option1:'long',option2:'blue',option3:'silver'}]

Into something formatted like this using Jquery.

var new_data = {
            short:{
              red:{gold:1,silver:2},
              blue:{gold:3,silver:4}
            },
            long:{
              red:{gold:5,silver:6},
              blue:{gold:7,silver:8}
               }
       }
Musa
  • 96,336
  • 17
  • 118
  • 137

3 Answers3

4

That is easier than you might think. Try this:

function helper(obj,tree,value) {
    for( var i=0, l=tree.length; i<l-1; i++) {
        obj[tree[i]] = obj[tree[i]] || {};
        obj = obj[tree[i]];
    }
    obj[tree[i]] = value;
}
var new_data = {}, l = data.length, i;
for( i=0; i<l; i++) {
    helper(new_data,[data[i].option1,data[i].option2,data[i].option3],data[i].id);
}
Niet the Dark Absol
  • 320,036
  • 81
  • 464
  • 592
1

This plain JS will do it:

var data = […];
var new_data = {};
for (var i=0; i<data.length; i++) {
    var o = new_data;
    for (var j=1; j<3; j++) {
        var prop = data[i]["option"+j];
        o = o[prop] || (o[prop] = {});
    }
    o[data[i]["option"+j]] = data[i].id;
}

But it looks easier to use that nested schema in the first place?

Bergi
  • 630,263
  • 148
  • 957
  • 1,375
1

You can use .reduce() like this:

var new_data = data.reduce(function(res, obj) {
    if (!res[obj.option1])
        res[obj.option1] = {};
    if (!res[obj.option1][obj.option2])
        res[obj.option1][obj.option2] = {};

    res[obj.option1][obj.option2][obj.option3] = obj.id;
    return res;
}, {});

or like this:

var new_data = data.reduce(function(res, obj) {
    var o = res;
    for (var i = 1; i < 3; i++)
        o = (o[obj["option" + i]] = o[obj["option" + i]] || {});

    o[obj.option3] = obj.id;
    return res;
}, {});
zap
  • 11
  • 2