erlang 根据SellerID分割购物车的商品

hpcdzsge  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(195)

想象你有一个装满商品的“购物车”,每件商品都有一个唯一的“卖家ID”。
现在我想在数据库PER sellerID中创建一个订单。
这意味着我必须将购物车(基本上是一个装满商品的数组)拆分为单独的数组,并按各自的sellerID进行拆分。
当然,我可以迭代sellerID,也可以,if sellerID == item.sellerID填充其他数组,但这就是我现在遇到的问题。
有了cart中单个sellerIDs的数量,我可以在迭代每个数组之前声明数组,但这对我来说似乎不实用。
作为附加信息:我用函数式编程语言来做这个,在这里变量是“不可变的”,一旦创建它们就不再是可改变的。
我也更多的是关于原则和是否有一个务实的解决这个问题的办法。
PS:我已经决定重写购物车,这样从一开始就已经按卖家ID排序,然后我可以直接在购物车的各个卖家ID上迭代创建订单。
不过,如果我以前没有在购物车中按SellerID排序,我对是否有面向解决方案的方法很感兴趣。

vcudknz3

vcudknz31#

FWIW,这里是没有Enum.group_by/2的解决方案。枚举中的所有内容都可以用Enum.reduce/3实现。

iex|💧|1 ▸ input =
  [
    %{id: 1, title: "Article1"},
    %{id: 2, title: "Article2"},
    %{id: 3, title: "Article3"}
  ]

iex|💧|2 ▸ Enum.reduce(input, %{}, fn %{seller_id: key} = elem, acc ->
...|💧|2 ▸   Map.update(acc, key, [elem], & &1 ++ [elem])             
...|💧|2 ▸ end)
%{
  2 => [%{seller_id: 2, title: "Article2"}],
  3 => [%{seller_id: 3, title: "Article1"},
        %{seller_id: 3, title: "Article3"}]
}
oxiaedzo

oxiaedzo2#

我的数据是这样的:

[
  %{id: 1, seller_id: 3, title: "Article1", price: 33.22, etc.},
  %{id: 2, seller_id: 2, title: "Article1", price: 33.22, etc.},
  %{id: 3, seller_id: 3, title: "Article1", price: 33.22, etc.}
]

我需要的是这样的东西:

[
  %{3, [
    %{id: 1, seller_id: 3, title: "Article1", price: 33.22, etc.},
    %{id: 3, seller_id: 3, title: "Article1", price: 33.22, etc.}
  ]},
  %{2, [
    %{id: 2, seller_id: 2, title: "Article1", price: 33.22, etc.}
  ]}
]

正如Aleksei Matiushkin所提到的,Enum.group_by/2就可以了。我只是用以下代码尝试了一下:

Enum.group_by(articles, & &1.seller_id)

我得到的是:

%{
  2 => [
         %{id: 2, seller_id: 2, title: "Article1", price: 33.22, etc.}
  ],
  3 => [
         %{id: 1, seller_id: 3, title: "Article1", price: 33.22, etc.},
         %{id: 3, seller_id: 3, title: "Article1", price: 33.22, etc.}
  ]}

但是,如果Enum.group_by/2不存在,或者如果我使用一种完全不同的语言,例如像Java这样的面向对象编程语言,我将如何解决这个问题呢?
我只是对如何实现这一点感兴趣,我不认为这对我来说是直截了当的研究Enum.group_by/2实现。

相关问题