-1

I have a array of objects, like that first json.

Based in attribute name i want to zip this array in another, like that. If the name is the same with another object, compile the object and set into fields array the others atrrtibutes and values.

[ 
   { 
      "name":"D1D1",
      "attritube":"HOST_NAME",
      "value_inv":"TEST1",
      "value_prod":"TESTA1"
   },
   { 
      "name":"D1D1",
      "attritube":"HOST_NAME",
      "value_inv":"TEST2",
      "value_prod":"TESTB1"
   },
   { 
      "name":"D2D2",
      "attritube":"COMMENTS",
      "value_inv":"TEST1",
      "value_prod":"TESTA1"
   }
]




[ 
   { 
      "name":"D1D1",
      "fields":[ 
         { 
            "attritube":"HOST_NAME",
            "value_inv":"TEST1",
            "value_prod":"TESTA1"
         },
         { 
            "attritube":"HOST_NAME",
            "value_inv":"TEST2",
            "value_prod":"TESTB1"
         }
      ]
   },
   { 
      "name":"D2D2",
      "fields":[ 
         { 
            "attritube":"COMMENTS",
            "value_inv":"TEST1",
            "value_prod":"TESTA1"
         }
      ]
   }
]
  • 2
    Effort so far ? did you tried anything ? – Code Maniac Oct 07 '19 at 15:26
  • Not a perfect match, hence no dupe-vote, but... -> [How to group an array of objects by key](https://stackoverflow.com/questions/40774697/how-to-group-an-array-of-objects-by-key) – Andreas Oct 07 '19 at 15:37

1 Answers1

0

This isn't pretty and it will not perform very well when you have a very large dataset, but it is functional and produces the output you expect.

const arr = [ 
   { 
      "name":"D1D1",
      "attritube":"HOST_NAME",
      "value_inv":"TEST1",
      "value_prod":"TESTA1"
   },
   { 
      "name":"D1D1",
      "attritube":"HOST_NAME",
      "value_inv":"TEST2",
      "value_prod":"TESTB1"
   },
   { 
      "name":"D2D2",
      "attritube":"COMMENTS",
      "value_inv":"TEST1",
      "value_prod":"TESTA1"
   }
];

const newArr = _.chain(arr)
  .groupBy('name')
  .toPairs()
  .map((val) => ({
    name: val[0],
    fields: _.map(val[1], (v) => _.omit(v, ['name']))
  }))
  .value();
  
console.log(newArr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
th3n3wguy
  • 3,649
  • 2
  • 23
  • 30