Компактный массив объектов с использованием lodash - PullRequest
0 голосов
/ 07 октября 2019

У меня есть массив объектов, как этот первый json.

Основанный на имени атрибута, я хочу сжать этот массив в другом, вот так. Если имя совпадает с другим объектом, скомпилируйте объект и задайте в массиве массив другие значения и значения.

[ 
   { 
      "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"
         }
      ]
   }
]

1 Ответ

0 голосов
/ 10 октября 2019

Это не красиво и не очень хорошо работает, когда у вас очень большой набор данных, но оно функционально и дает ожидаемый результат.

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>
...