Да, Рамда groupWith
предназначен для группировки последовательных элементов. groupBy
- это то, что вы, вероятно, хотите. Требуется функция, которая преобразует ваш объект в строку, а затем группирует ваш массив в объект с массивом для каждой преобразованной строки. Вы можете создать эту строку так, как вам нравится, чаще всего путем извлечения одного свойства. Здесь мы можем объединить несколько свойств в строку:
const collect = pipe (
groupBy (({store: {metadata: m}}) => `${m.itemName}~${m.itemCode}~${m.itemDueDate}`),
values
)
const data = [{store: {id: "1", metadata: {itemName: "Q", itemCode: "332", itemDueDate: "2021-10-28", foo: "a"}}}, {store: {id: "2", metadata: {itemName: "WA", itemCode: "190", itemDueDate: "2021-08-23", foo: "b"}}}, {store: {id: "3", metadata: {itemName: "P", itemCode: "199", itemDueDate: "2020-12-03", foo: "c"}}}, {store: {id: "4", metadata: {itemName: "WA", itemCode: "190", itemDueDate: "2021-08-23", foo: "d"}}}, {store: {id: "5", metadata: {itemName: "P", itemCode: "199", itemDueDate: "2020-12-03", foo: "e"}}}, {store: {id: "6", metadata: {itemName: "WA", itemCode: "190", itemDueDate: "2021-08-23", foo: "f"}}}]
console .log (
collect (data)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
<script> const {pipe, groupBy, values} = R </script>
Я сделал предположение о вашей фактической структуре, поскольку то, что вы опубликовали, не является законным JS. Я также добавил дополнительные элементы, поскольку мы хотим продемонстрировать, что происходит, когда есть реальные дубликаты.
Обратите внимание, что вызов values
в конце превращает это в массив массивов. Вы можете сохранить исходный объект, но я думаю, что такие ключи, как "P~199~2020-12-03"
, вряд ли будут очень полезны. Или вам может потребоваться выполнить дополнительную обработку для достижения вашей основной цели.
Если некоторые из ваших значений могут включать ~
, вам может потребоваться другой разделитель.