Лучший способ уменьшить массив объектов до массива похожих объектов с дочерним массивом различий?

#arrays #dictionary #reduce

#массивы #словарь #уменьшить

Вопрос:

Название будет немного запутанным, но в основном у меня есть несколько типичных операций со списком стилей сокращения карты, которые я хочу выполнить, но не уверен, какой путь будет наиболее чистым для продолжения.

У меня есть начальный список объектов, которые имеют следующие ключи:

 {keyA, keyB, shared1, ..., shared10, unique1, ..., unique10}  

И я хочу, чтобы в итоге получилась следующая структура:

 {keyA:   [  {  keyB,   shared1, ..., shared10,   unique: [  {unique1, ..., unique10}  ]  }  ] }  

т. е. я сначала хочу сгруппировать-по тем же значениям keyA, затем в этих сгруппированных списках сгруппировать по ключу, но вместо того, чтобы использовать ключ в качестве ключа, я хочу, чтобы он был включен в объект, содержащий некоторые другие свойства, которые будут одинаковыми для всех объектов, имеющих одинаковые ключи, а затем список объектов, содержащих разные. Таким образом, примером может быть следующий ввод:

 [  {keyA:'A', keyB: 'X', shared1: 'Test', unique1: 7},  {keyA:'A', keyB: 'X', shared1: 'Test', unique1: 9},  {keyA:'A', keyB: 'Y', shared1: 'Foo', unique1: 6},  {keyA:'A', keyB: 'Y', shared1: 'Foo', unique1: 5},  {keyA:'B', keyB: 'X', shared1: 'Test', unique1: 8},  {keyA:'B', keyB: 'X', shared1: 'Test', unique1: 1} ]  

Что, после моего набора операций, должно привести к следующему:

 {  A: [  {  keyB: 'X',  shared1: 'Test',  unique: [{unique1: 7}, {unique1: 9}]  },  {  keyB: 'Y',  shared1: 'Foo',  unique: [{unique1: 6}, {unique1: 5}]  }  ],  B: [  {  keyB: 'X',  shared1: 'Test',  unique: [{unique1: 8}, {unique1: 1}]  }  ] }  

While it isn’t difficult to get to that point by doing a lot of different operations, I find it quite difficult to get there in just a small amount of clean, maybe even chained, operations. For example, here’s how it could technically be done, I guess (pseudocode, but in my project I’m using JS and lodash):

 groupedByKeyA = groupBy(list, 'keyA') forEach key, val in groupedByKeyA:  groupedByKeyA[key] = groupBy(list, 'keyB')  temp = []  forEach key2, val2 in groupedByKeyA[key]:  temp.add({  keyB: key2,  shared1: val2[0], // If exists  unique: val2.map(item =gt; ({unique1: item.unique1}))  })  groupedByKeyA[key] = temp  

Но это, честно говоря, действительно уродливо, а также много зацикливаний. Как я могу сделать это лучше, возможно, даже «чисто функциональным» способом?

Спасибо