sunnysideup
sunnysideup

Reputation: 79

Javascript - nested arrays transformed to array of objects

I have a nested array data structure like this -

var arrays = [
        [
            ['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']
        ],
        [
            ['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']
        ]
    ];

and I need to transform this into an array of objects -

[
        {firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk'},
        {firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager'}
    ]..



    My code below gives- 

    function objectArray(arr) {
      var obj1 ={};
      var empData=[];
        for (var i = 0; i < arr.length; i++)
        {
            if (Array.isArray(arr[i]))
                { 
                  arr[i].reduce(function(acc,prd){
                   // console.log(prd);
                       console.log(acc.key=prd[0],acc.Value=prd[1]);//--> output shown below
                       return acc;
                  },{});
                }
        }
    }

     var returnArrayOfObjs = objectArray(arrays);
     var empData = [];
     empData.push(returnArrayOfObjs);
     console.log(empData);  

The above log statement gives me an [undefined] as shown below in my output -

The output I get is as below - What am I doing wrong? Pls help!

firstName Joe
lastName Blow
age 42
role clerk
firstName Mary
lastName Jenkins
age 36
role manager
[undefined]

Upvotes: 1

Views: 52

Answers (2)

Ori Drori
Ori Drori

Reputation: 191976

Iterate the array with Array#map, and Array#reduce each sub array to an object.

const arr = [[["firstName","Joe"],["lastName","Blow"],["age",42],["role","clerk"]],[["firstName","Mary"],["lastName","Jenkins"],["age",36],["role","manager"]]];

const result = arr.map((subArr) => subArr.reduce((obj, [key, value]) => {
  obj[key] = value;
  return obj;
}, {}));

console.log(result);

Upvotes: 2

sauntimo
sauntimo

Reputation: 1591

I wrote a forEach() solution but map() / reduce() is probably more elegant so I upvoted @OriDrori :) Just posting this for comparison.

var arrays = [[['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
        [['firstName', 'Mary'], ['lastName', 'Jenkins'], ['age', 36], ['role', 'manager']]
    ];

var rst = [];
    
 arrays.forEach(function(item){
    var obj = {};
    item.forEach(function( subitem, index ){
    	obj[ subitem[0] ] = subitem[1]
    });
    rst.push(obj);
 });
 
 console.log( rst );

Upvotes: 2

Related Questions