如何在Clojure中向哈希集添加数据?

时间:2017-01-23 09:59:57

标签: clojure hashmap hashset

我有一组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格式设置,但如果我走错了,请给出一些建议。)

2 个答案:

答案 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})