This is my current solution. Again, it works fine, but seems a little verbose. I have a function called update-item, which has to call update-item-in-category with the same parameters plus the category I'm currently mapping through. On Jan 26, 2015 8:11 AM, "Lucas Bradstreet" <lucasbradstr...@gmail.com> wrote:
> Given these points I would probably just do: > > (defn update-val-with-id [values m] > (map (fn [v] > (if (= (:id v) id) > (merge v m) > v)) > values)) > > I'm not that happy with it either, so other suggestions are welcome. > > On 27 January 2015 at 00:06, Josh Stratton <strattonbra...@gmail.com> > wrote: > > They're not keyed by id because order in both the category and its items > is > > important. I could maintain the order explicitly, but that just makes > other > > problems like reordering more difficult. > > > > As a couple people have suggested I could access the page using vector > > indexing, but then I'd need to figure out what those induces are for the > > category and the page given the item id. That seems reasonable, but I'm > not > > sure the best way to do that. I'm sure there's some python enumerate > > equivalent where I can map all categories and items and filter down just > the > > pair with the matching item id. > > > > On Jan 26, 2015 7:47 AM, "Michael Willis" <willismich...@gmail.com> > wrote: > >> > >> Now that I think about it, I wonder why your categories aren't keyed by > >> id, like this: > >> > >> (def categories [ {1 {:text "foo"} 2 {:text "bar" :ack 5}} {3 {:age > 7}}]) > >> > >> Then the update-in can take the category id, instead of having to know > its > >> index within a vector: > >> > >> (update-in categories [1 3] merge { :age 12 :somethingElse 29 }) > >> [{1 {:text "foo"}, 2 {:text "bar", :ack 5}} {3 {:age 12, :somethingElse > >> 29}}] > >> > >> > >> On Monday, January 26, 2015 at 9:42:56 AM UTC-6, Michael Willis wrote: > >>> > >>> (def categories [ [ { :id 1 :text "foo" } { :id 2 :text "bar" :ack 5 } > ] > >>> [ { :id 3 :age 7 } ] ]) > >>> #'user/categories > >>> (update-in categories [1 0] merge { :age 12 :somethingElse 29 }) > >>> [[{:text "foo", :id 1} {:text "bar", :ack 5, :id 2}] [{:age 12, > >>> :somethingElse 29, :id 3}]] > >>> > >>> > >>> On Monday, January 26, 2015 at 8:54:58 AM UTC-6, Erik Price wrote: > >>>> > >>>> Many functions that affect keyed collections will work on vectors if > you > >>>> supply the numeric index as a key. > >>>> > >>>> e > >>>> > >>>> On Monday, January 26, 2015, Josh Stratton <stratto...@gmail.com> > wrote: > >>>>> > >>>>> I'm new to clojure and FP in general. One thing that has always > been a > >>>>> little confusing for me is working with immutable trees. I have a > vector of > >>>>> categories, each category containing a vector of items--each one a > hashmap. > >>>>> In that hashmap I have a bunch of attributes including an item-id. > Now, > >>>>> assuming I have an item id, what's the easiest way to update the > appropriate > >>>>> hashmap? I can't use an assoc, I believe, because my data is in a > >>>>> vector--not keyed by the id. > >>>>> > >>>>> What I have been doing is writing a function that maps the categories > >>>>> to new categories and then write another function that is called on > every > >>>>> item and updates it iff the item id matches. This works, but it > seems > >>>>> really clunky and I'm assuming there's a simpler way to do it. > >>>>> > >>>>> ; categories is a vector of item vectors, where the item is a hash > >>>>> (def categories [ [ { :id 1 :text "foo" } { :id 2 :text "bar" :ack 5 > } > >>>>> ] [ { :id 3 :age 7 } ] ]) > >>>>> > >>>>> Is there a more elegant workflow for updating categories? Let's say > I > >>>>> want to update item of id 3 with { :age 12 :somethingElse 29 }, > what's the > >>>>> easiest way to do this? > >>>>> > >>>>> ; so the return would be > >>>>> [ [ { :id 1 :text "foo" } { :id 2 :text "bar" :ack 5 } ] [ { :id 3 > :age > >>>>> 12 :somethingElse 29 } ] ] > >>>>> > >>>>> -- > >>>>> You received this message because you are subscribed to the Google > >>>>> Groups "Clojure" group. > >>>>> To post to this group, send email to clojure@googlegroups.com > >>>>> Note that posts from new members are moderated - please be patient > with > >>>>> your first post. > >>>>> To unsubscribe from this group, send email to > >>>>> clojure+unsubscr...@googlegroups.com > >>>>> For more options, visit this group at > >>>>> http://groups.google.com/group/clojure?hl=en > >>>>> --- > >>>>> You received this message because you are subscribed to the Google > >>>>> Groups "Clojure" group. > >>>>> To unsubscribe from this group and stop receiving emails from it, > send > >>>>> an email to clojure+unsubscr...@googlegroups.com. > >>>>> For more options, visit https://groups.google.com/d/optout. > >> > >> -- > >> You received this message because you are subscribed to the Google > >> Groups "Clojure" group. > >> To post to this group, send email to clojure@googlegroups.com > >> Note that posts from new members are moderated - please be patient with > >> your first post. > >> To unsubscribe from this group, send email to > >> clojure+unsubscr...@googlegroups.com > >> For more options, visit this group at > >> http://groups.google.com/group/clojure?hl=en > >> --- > >> You received this message because you are subscribed to the Google > Groups > >> "Clojure" group. > >> To unsubscribe from this group and stop receiving emails from it, send > an > >> email to clojure+unsubscr...@googlegroups.com. > >> For more options, visit https://groups.google.com/d/optout. > > > > -- > > You received this message because you are subscribed to the Google > > Groups "Clojure" group. > > To post to this group, send email to clojure@googlegroups.com > > Note that posts from new members are moderated - please be patient with > your > > first post. > > To unsubscribe from this group, send email to > > clojure+unsubscr...@googlegroups.com > > For more options, visit this group at > > http://groups.google.com/group/clojure?hl=en > > --- > > You received this message because you are subscribed to the Google Groups > > "Clojure" group. > > To unsubscribe from this group and stop receiving emails from it, send an > > email to clojure+unsubscr...@googlegroups.com. > > For more options, visit https://groups.google.com/d/optout. > > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.