我在地图中的矢量中有一张地图。
{ :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",
}
]
} `
任何贡献都受到高度赞赏。
答案 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
键并将结果替换为初始地图。