Underscore Convert array to object keys

1.4k views Asked by At

I am trying to convert this array to an object. Using underscore, I want to convert this array :

[
{
    "id": "parentA",
    "children": [
        {
            "name": "name1"
        },
        {
            "name": "name2"
        },
        {
            "name": "name3"
        }
    ]
},
{
    "id": "parentB",
    "children": [
        {
            "name": "name4"
        },
        {
            "name": "name5"
        },
        {
            "name": "name6"
        }
    ]
}]

into an object that looks like this:

{
    "name1": "parentA",
    "name2": "parentA",
    "name3": "parentA",
    "name4": "parentB",
    "name5": "parentB",
    "name6": "parentB"
}

I'm really just looking for the cleanest/simplest way possible.

4

There are 4 answers

1
Austin Greco On BEST ANSWER

Here's a fairly short way to do it with two reduce:

var data = [
{
    "id": "parentA",
    "children": [
        {
            "name": "name1"
        },
        {
            "name": "name2"
        },
        {
            "name": "name3"
        }
    ]
},
{
    "id": "parentB",
    "children": [
        {
            "name": "name4"
        },
        {
            "name": "name5"
        },
        {
            "name": "name6"
        }
    ]
}];

var out = _.reduce(data, function(result, parent) {
  _.reduce(parent.children, function(r, child) {
    r[child.name] = parent.id;
    return r;
  }, result);
  return result;
}, {});

document.write(JSON.stringify(out));
<script src="http://underscorejs.org/underscore-min.js"></script>

0
nickclaw On

You'll only need to use underscore if you're supporting browsers without native reduce and forEach array methods, but you can do it like this.

var result = _.reduce(array, function(memo, entry) {
    _.each(entry.children, function(child) {
        memo[child.name] = entry.id;
    });
    return memo;
}, {});
0
squid On
function expand(list){
  return _.reduce(list,function(a,b) {
      _.each(b.children, function(c) {
      a[c.name] = b.id;
    });
    return a;
  },{});
}

Check the output for your sample here

0
allvideolectures On

var a = [{
  "id": "parentA",
  "children": [{
    "name": "name1"
  }, {
    "name": "name2"
  }, {
    "name": "name3"
  }]
}, {
  "id": "parentB",
  "children": [{
    "name": "name4"
  }, {
    "name": "name5"
  }, {
    "name": "name6"
  }]
}];
var new_obj = {};
var len = a.length;

for (j = 0; j < len; j++) {
  var c = $.extend({}, a[j]);

  var children_length = (c.children).length;


  for (i = 0; i < children_length; i++) {
    var temp = ((a[j].children)[i]).name;
    new_obj[temp] = c.id;
  }
}
document.write(JSON.stringify(new_obj));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>