了解 `update-if-exists` 是很好的,但在这里并不能击中要害..
原始方法的主要和根本的问题是,它将每个键的逻辑和更新映射逻辑混合在一起,从而掩盖了翻译的本质(例如,键和值都发生了变化)以及翻译之间的相互关系(后来的翻译是否依赖于早期的翻译)。
将两个问题分开,每个问题都会更容易改进。
要翻译1个属性,可以有一个函数(可能是一个多方法),或者查找表。例如,假设你有一个函数 svg->cljfx
,它接受一个 [k v]
(例如,映射条目)并生成一个新的 [k v]
;那么可以通过下面方式翻译整个 svg-attributes
:
(->> svg-attributes
(map svg->cljfx)
(into {}))
易于阅读,但如果不变的属性多于变化的属性,那么不太高效。
或者,假设你有一个将 svg 键映射到函数(可能是匿名函数)的查找表(映射),该函数产生一个新的 [key value]
对。循环可以遍历已知转换。它必须跳过缺失的键,但至少可以一次性覆盖这种情况,而不是每个键一次。逻辑会更复杂,但可能运行得更快。