更新地图中矢量内的嵌套地图

时间:2017-09-04 17:21:05

标签: clojure clojurescript

我在地图中的矢量中有一张地图。

{ :label "Apparel & Accessories", 
  :img_class "itm_3", 
  :children [
             {:id "sub1", 
              :label "Clothing", 
              :markup [:div] 
             } 
             {:id "sub2", 
              :label "Shoes & Footwear", 
              :markup [:div] 
             } 
   ] 
}  `

我想要做的是解开密钥:来自所有条目的标记。我一直在努力奋斗2个小时。我得到的只是远离关键:儿童。 但要求是仅删除:标记键。

所以最后的输出应该是

{ :label "Apparel & Accessories", 
  :img_class "itm_3", 
  :children [
             {:id "sub1", 
              :label "Clothing", 
             } 
             {:id "sub2", 
              :label "Shoes & Footwear", 
             } 
   ]
}   `

任何贡献都受到高度赞赏。

4 个答案:

答案 0 :(得分:2)

一次性完成改动是一个好习惯:

(update m :children (fn [v] (assert (vector? v)) (mapv #(dissoc % :markup) v)))

此处m仅被引用一次。例如,如果您正在进行swap!

如果你没有矢量,但想要动态创建一个矢量,那么这将有效:

(update m :children (fn [xs]
                      (->> xs
                           vec
                           (mapv #(dissoc % :markup)))))

但另一方面,没有必要使用矢量。当assert设置为:

时,没有:children的原始解决方案正常工作
'({:id    "sub1",
  :label  "Clothing",
  :markup [:div]}
 {:id     "sub2",
  :label  "Shoes & Footwear",
  :markup [:div]})

答案 1 :(得分:1)

我分两步解决了,不幸的是,不是一个。

(def m { :label "Apparel & Accessories", :img_class "itm_3", :children [ {:id "sub1", :label "Clothing", :markup [:div] } {:id "sub2", :label "Shoes & Footwear", :markup [:div] } ] })

(defn dissoc-markup [child]
  (dissoc child :markup))

(update m :children #(mapv dissoc-markup %))

答案 2 :(得分:1)

如果您确定要在每次看到时删除:标记,这是一种简单的方法:

(def your-data {:your-data "...."})
(clojure.walk/postwalk (fn [m] 
                         (if (map? m) 
                           (dissoc m :markup) 
                           m))
                       your-data)

答案 3 :(得分:0)

如果您的初始地图为#include <iostream> #include <iomanip> #include <sstream> using namespace std; int toBase_8(int number){ //basé sur un exemple de chiffre 14 avec base 8 -> 016 int base(8); int entier1; double entier2; double decimal; double resTemp; int res; resTemp = (double)number / base; //donne 1.75 entier1 = (int)resTemp; //donne 1 car transforme le double en int alors le int garde seulement l'entier decimal = resTemp - entier1; //donne 0.75 restant entier2 = decimal * (double)base; // donne 6 res = ((entier1*10)+(int)entier2); //donne 16 return res; } int toBase_2(float number){ if (number > 0 && number <= 255){ //s'sassure que le nombre est entre 0 et 255 int arr[8]; int pos(0); while ((int)number != 0 || pos == 7){ // à chaque tour de boucle, convertie le float en entier et le compare. ajouté le ou pour etre certains de mettre des 0 jusqu'à la fin meme si la premiere condition (!=) est atteinte number = number / 2; if (number == (int)number){ arr[pos] = 0; //si entier }else{ arr[pos] = 1; //si decimal } number = (int)number; // remet le float en int pour la prochaine division. En base 2 chaque nombre decimal doit etre redivisé en entier. Ex.: (9/2) = 4.5. Donne 1 car decimal. Apres on recommence à partir de (4/2) = 2, et non pas 4.5/2. Donne 0 car entier etc.. pos++; } reverse(begin(arr), end((arr))); //reverse le array avec algorithm.h car la réponse binaire ce lit sens inverse. //mettre le array(int) en string puis en un seul int en utilisant stringstream <sstream> stringstream ss; for (int d(0); d<(sizeof(arr)/ sizeof(arr[0])); d++){ ss << arr[d]; //ajoute les int dans le stream } //METHODE 1: utiliser en string //cout << ss.str() << endl; //sort le stream en string //METHODE 2: utiliser en int int myInt; ss >> myInt; //envoie le string dans le int //cout << myInt << endl; return myInt; }else{ return 0; } } int main() { cout << setw(8) << setfill('0') << toBase_2(234) << endl; // ex.: 14 en base 8 => 016 //cout << setw(3) << setfill('0') << toBase_8(14) << endl; return 0; } ,则可能的解决方案是

m

(assoc m :children (mapv #(dissoc % :markup) (m :children))) 的值,删除:children键并将结果替换为初始地图。