如何在ClojureScript中正确解构JavaScript对象?
解决ClojureScript解构JavaScript对象的问题
你遇到的这个问题很常见:ClojureScript的:keys解构默认是针对Clojure风格的map(关键字键),但你用#js{:a 10, :b 20}生成的是JavaScript对象——它的属性键是字符串类型的"a"、"b",而非Clojure的关键字:a、:b,所以直接用:keys根本匹配不到,自然会返回nil。
下面给你两种实用的解决办法:
方法1:用:strs专门解构字符串键的JS对象
ClojureScript提供了:strs选项,专门用来处理键为字符串的对象(包括JS对象),语法和:keys类似,只需传入字符串形式的键名即可:
(let [{:strs [a b]} #js{:a 10, :b 20}] (print a) ;=> 10 (print b)) ;=> 20
方法2:用:keywordize-keys转成Clojure map再解构
如果你更习惯用关键字解构,可以给解构添加:keywordize-keys true选项,它会自动把JS对象的字符串属性名转换成Clojure关键字,这样:keys就能正常匹配了:
(let [{:keys [a b] :keywordize-keys true} #js{:a 10, :b 20}] (print a) ;=> 10 (print b)) ;=> 20
额外补充
顺便提一句:当你用#js{:a 10, :b 20}创建JS对象时,ClojureScript会自动把关键字:a、:b转换成字符串"a"、"b"作为对象的属性名——这就是为什么直接用:keys匹配失败的核心原因。
内容的提问来源于stack exchange,提问作者Didier A.
相关产品推荐
相关产品推荐

