#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
Но это, честно говоря, действительно уродливо, а также много зацикливаний. Как я могу сделать это лучше, возможно, даже «чисто функциональным» способом?
Спасибо