我有一组hashmap(或一个hashset,一个hashmaps数组),如下所示:
{:group "mammal" :name "lion" :score 566}
我有一个像这样的新hashmap:
#{{:rank 2 :page 1 :group "fish"}
{:rank 1 :page 1 :group "mammal" :name "lion" :score 566}
{:rank 3 :page 2 :group "bird"}}
我想要做的基本上是将新的hashmap数据合并到上面的数组中,所以它看起来像这样('group'是连接键):
$(document).ready(function() {
var whichSelect = null;
$("#dialog-form").dialog({
autoOpen: false,
modal: true,
buttons: {
"Save": addUser,
Cancel: function() {
$("#dialog-form").dialog( "close" );
}
}
});
$(".d1").on('change', function() {
if ($(this).val() == 'audi') {
whichSelect = this;
$("#dialog-form").dialog("open");
}
});
function addUser(){
var selected = $("#dialog-form input[type='radio']:checked");
if(selected.length > 0 && selected.val()=="Yes"){
$(whichSelect).parent().parent().append("<td>" + selected.val() + "</td>");
$("#dialog-form").dialog("close");
}
}
});
我的想法是首先在数组中找到1的索引(从零开始),然后使用assoc-in函数和给定的新hashmap,以便'group'被忽略或保持不变,并且'name'和'得分'被添加。
首先,我需要找到一种方法来获取该索引,但这就是我现在被困住的地方。
有没有简单易行的方法?完成的数据将转换为json。
(我甚至不确定构建像这样的哈希映射数组是否是在Clojure中制作一些json数据的正确方法。至少,将一组哈希映射传递给json库现在可以生成一个数据数组以json格式设置,但如果我走错了,请给出一些建议。)
答案 0 :(得分:2)
首先,哈希集在这个用例中没有给你任何利润(任何序列都可以,任何序列都会转换为json数组,基于我对clojure中json libs的了解)
但是你所描述的操作类型是相当频繁的,和/或集合可能很大,通过每次遍历整个coll来完成它是非常昂贵的。我会将您的数据重新格式化为由group索引的地图:
(def mydata {"fish" {:rank 2 :page 1 :group "fish"}
"mammal" {:rank 1 :page 1 :group "mammal"}
"bird" {:rank 3 :page 2 :group "bird"}})
然后像这样更新:
(defn update-animal [animal data]
(update data (:group animal) merge animal))
user> (update-animal {:group "mammal" :name "lion" :score 566} mydata)
;;{"fish" {:rank 2, :page 1, :group "fish"},
;; "mammal" {:rank 1, :page 1, :group "mammal", :name "lion", :score 566},
;; "bird" {:rank 3, :page 2, :group "bird"}}
当你需要将它转换为json时,你只需要取值序列:
(to-json (vals data))
答案 1 :(得分:0)
设置没有索引。您可以迭代其所有元素,如果任何一个元素与新的hashmap匹配,则将其替换为合并的hasmap(现有元素和新元素)。最后将结果转换为集合。
(defn update-set
[baseset elem]
(set (map #(if (= (:group elem) (:group %))
(merge elem %)
%1)
baseset)))
(def mydata #{{:rank 2 :page 1 :group "fish"}
{:rank 1 :page 1 :group "mammal"}
{:rank 3 :page 2 :group "bird"}})
(update-set mydata {:group "mammal" :name "lion" :score 566})