我正在使用Elm前端的电子商务网站,我想知道对象是共享还是重复。我很确定答案,但我只是想确保。
[基本上,我有一个ProductVariant
,其中包含一些Colour
。目前ProductVariant
作为字段colour_ids : List ColourId
(这是我从json中获得的),但我正在考虑将ID替换为颜色本身:colours : List Colour
。当我解码JSON之后就可以完成操作,而无需在colours
词典中查找颜色。我是否正确地假设每个Colour
将在不同的变体之间共享或每种颜色将被复制,从而占用更多的内存。
我制作了一个简单的程序来查看已编译的JS输出。带有榆木代码
type alias Color = { red: Int, green: Int, blue: Int }
black: Color
black = { red = 255, green = 255, blue = 255 }
white: Color
white = { red = 0, green = 0, blue = 0 }
red: Color
red = { red = 255, green = 0, blue = 0 }
colors: List Color
colors =
[
black,
white,
red,
{ red = 123, green = 234, blue = 11 },
black,
{ red = 123, green = 234, blue = 11 },
red,
{ red = 123, green = 234, blue = 11 }
]
输出的JS代码包含
var author$project$SharedData$colors = _List_fromArray(
[
author$project$SharedData$black,
author$project$SharedData$white,
author$project$SharedData$red,
{blue: 11, green: 234, red: 123},
author$project$SharedData$black,
{blue: 11, green: 234, red: 123},
author$project$SharedData$red,
{blue: 11, green: 234, red: 123}
]);
这表明编译器能够重用预定义的黑色,白色和红色,但是即使使用完全相同的数据创建新记录,也总是会重复。
我不知道您的数据是如何组织的,但是对于上述示例,我没有尝试优化数据结构,而是将颜色存储为十六进制代码字符串。
我不确定100%JS引擎如何处理字符串,但是在许多其他平台上,单个字符串的堆中只有一个实例。对于上述玩具应用,这将意味着使用"7BEA0B"
而不是{ red: 123, green: 234, blue: 11 }
按照@kaskelotti的建议,我制作了一个小程序,从字典中两次提取相同的项目,并使用JS调试器检查是否共享数据。
import Html exposing (text,div)
import Dict
a = {t= "My name is a"}
b = {t= "My name is B"}
d = Dict.fromList [("a", a), ("b", b)]
mytest = List.filterMap (\key -> Dict.get key d) ["a", "b", "a"]
main =
let x = mytest
(y, z)= case x of
[a1,_,a2] -> (a1,a2)
_ -> (a,b)
in div [] (List.map (\o -> text o.t) mytest)
通过在main
中设置断点,我可以检查y
和z
实际上是否相同(y === z
为真)。同时修改y.t
修改z.t
。