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.

Reply via email to