【发布时间】:2021-05-13 14:40:56
【问题描述】:
我有一个用例要在我的爱好项目中实现,我需要根据以下标准在地图、项目的向量中添加和删除元素
以下是我的代码中使用的输入数据结构
Items 是一个 LazySeq
[
{
:name “Bananas”
:line-no 0
:quantity 4
}
{
:name “Apple”
:line-no 2
:quantity 3
}
]
return-quantities 是一个 PersistentArrayMap,其中 line-no 作为键,如下所示
{
2 1
}
我的目标是获得一个合成向量,其中项目根据退货数量进行拆分
[
{
:name “Bananas”
:line-no 0
:quantity 4
}
{
:name “Apple”
:line-no 2
:quantity 1
:returned? true
}
{
:name “Apple”
:line-no 2
:quantity 2
}
]
下面是我实现该目标的示例代码
(let [items-to-be-added
(for [[line-no return-quantity] return-quantities]
(let [item (seek #(= line-no (:line-no %)) items)
item-quantity (:quantity item)
regular-item (when (pos? (- item-quantity return-quantity))
(assoc item :quantity (- item-quantity rma-quantity))
(assoc item :return-item? true))
returned-item (assoc item :quantity rma-quantity)
result [regular-item returned-item]]
result))
items-to-be-removed
(for [[line-no] return-quantities]
(let [item (seek #(= line-no (:line-no %)) items)]
item))
items-updated (filterv #(not (contains? (vec items-to-be-removed) %)) (vec items))]
(doall (flatten (concat items-updated items-to-be-added))))
上述代码的问题是过滤(从向量中删除一组元素)不起作用。有人可以帮我解决矢量过滤的问题吗?也有人可以帮助我用更高效的代码来实现这一点,因为我觉得 impl 很复杂?
【问题讨论】:
-
您能解释一下
2 : 1的含义吗?此外,您想要的输出也不清楚。还有,seek是什么? -
它是一个键为 2 且值为 1 的映射?在我的问题的上下文中,这意味着第 2 行返回的数量是 1 @AlanThompson
-
我已经使用 set 进行了过滤。有什么方法可以让代码更高效、更好,因为它看起来很复杂? @AlanThompson 换句话说,我可以用更少的代码更高效地实现它吗?
-
您可能还对此文档来源列表感兴趣:github.com/io-tupelo/clj-template#documentation