2017-01-09 8 views
0

私はこのようになりますいくつかのJSON持っている:Clojureで動的キーワードを作成するには?

{"_gallery123abc": "foo" }

をしかし、それはまた次のように表示されることがあります。

{"_gallery789xyz": "foo" }

はにキーワードを作成するためのClojureでの方法はあります末尾の文字に関係なく "_gallery"値を取得できるように正規表現を受け入れますか? ((keyword #"^_gallery") data)の行に沿った何かdataは私のJSONですか?

(-> data :response :nodes :_gallery :slides :title)のような構造をトラバースできるようにチェーン内で作業する必要があります。

答えて

1

私はそのためにいくつかのユーティリティ関数を作ることが賢明であると思います:

(defn key-like [m k] 
    (let [s (name k)] 
    (some #(when (clojure.string/starts-with? (name (key %)) s) 
      (val %)) 
      m))) 

、その後、あなたが使用することができますあなたが望んでいた、それはほとんどの方法:

user> (-> {:a {:b {:_gallery123 {:d "BOOM!"}}}} 
      :a 
      :b 
      (key-like :_gallery) 
      :d) 
;;=> "BOOM!" 

別の方法ではなく->のいくつかの機能を作ることである(012のような)、これは渡されたタイプに応じてキーを取り出すことができます。

(defn find-key [m k] 
    (if (instance? java.util.regex.Pattern k) 
    (some #(when (re-matches k (name (key %))) 
      (val %)) 
      m) 
    (get m k))) 


(defn get-in+ [m & ks] 
    (reduce (fn [curr-val k] 
      (if (nil? curr-val) (reduced nil) 
       (find-key curr-val k))) 
      m ks)) 

user> (get-in+ {:a {:b {:_gallery123asd {:d "BOOM!"}}}} 
       :a 
       :b 
       #"_gallery\d{3}\w{3}" 
       :d) 
0

正規表現に一致するキーで値を取得するには、これを試してみてください:

for(var key in data) { 
    if(/^_gallery/.test(key)) 
    ... do something with obj[key] 
} 
+0

は、私は私のような構造を横断できるように、それはチェーンで作業する必要があります: '( - >データ:応答:ノード:_gallery:スライド:タイトル)それは問題の一部ではなかった' – jmargolisvt

+0

、しかし、私にとっては、単にdata.response.nodesを使ってノードをたどることができます。何をしようとしていますか? – Yaser

+0

あなたは正しいです。それは明確ではなかったので、私はそれを追加しました。私はジッパーで物事を終わらせる別の方法を見つけましたが、私は別の方法があるかどうか不思議なので頼んでいます。 – jmargolisvt

関連する問題