Вопрос

I'm interested in creating a function like the one shown below using just core functions in Clojurescript.

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));

So far I have:

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

The second part of the function above would call (find-all items k v) for each keyvals, store the resulting matches, and then feed those into the next call. items would be a vector of maps, instead of an array of objects as well.

Это было полезно?

Решение

Take a look at (source clojure.set/index) for inspiration.

(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"}}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top