2014-05-04 36 views
1

我有興趣使用Clojurescript中的核心函數創建如下所示的函數。Clojurescript中的'find'函數匹配所有的鍵/值

var props = [ 
    ["eyes", "brown"], 
    ["age", "20"] 
]; 

var people = [ 
    {eyes: "brown", age: "20", name: "Dick"}, 
    {eyes: "green", age: "30", name: "Tom"}, 
    {eyes: "blue", age: "20", name: "Sally"}, 
    {eyes: "brown", age: "20", name: "Harry"} 
]; 

find = function (items, keyvals) { 
    var results = items.slice(0); 

    keyvals.forEach(function (keyval) { 
     results = results.reduce(function (memo, item) { 
      if (item.hasOwnProperty(keyval[0]) && 
       item[keyval[0]] === keyval[1]) { 
       memo.push(item); 
      } 
      return memo; 
     }, []); 
    }); 

    return results; 
}; 

document.body.innerHTML = JSON.stringify(find(people, props)); 

到目前爲止,我有:

(defn find-all 
    ([items k v] 
    (filter #(= (k %) v) items)) 
    ([items k v & keyvals] 
    (into [k v] keyvals))) 

功能的第二部分上面將調用(find-all items k v)每個keyvals,存儲所產生的匹配,然後進料入那些下一個呼叫。 items將是一個地圖矢量,而不是一個對象數組。

回答

0

看看(source clojure.set/index)獲取靈感。

(def props {:eyes "brown", :age "20"}) 

(def people #{{:eyes"brown", :age "20", :name "Dick"} 
       {:eyes "green", :age "30", :name "Tom"} 
       {:eyes "blue", :age "20", :name "Sally"} 
       {:eyes "brown", :age "20", :name "Harry"}}) 

((clojure.set/index people (keys props)) props) 
;=> #{{:eyes "brown", :age "20", :name "Harry"} 
     {:eyes "brown", :age "20", :name "Dick"}} 
相關問題