[xquery-talk] From map entry pairs to a pair of arrays

Joe Wicentowski joewiz at gmail.com
Sat Jul 15 11:16:19 PDT 2017


Great, thank you, Emmanuel!  That is much better.

I might just offer one enhancement - switching from a FLWOR to the simple
map operator:

```
xquery version "3.1";

let $letters-numbers := map { "a": 1, "b": 2, "c": 3 }
let $keys := map:keys($letters-numbers)
return (
    array { $keys },
    array { $keys ! map:get($letters-numbers, .) }
)
```

Joe

On Sat, Jul 15, 2017 at 12:12 PM Emmanuel Chateau <emchateau at laposte.net>
wrote:

> Hi,
> I would say
>
> ```
> let $letters-numbers := map { "a": 1, "b": 2, "c": 3 }
> let $keys := map:keys($letters-numbers)
> return (
>   array { $keys },
>   array { for $key in $keys return map:get($letters-numbers, $key) }
> )
> ```
> > Le 15 juil. 2017 à 11:41, Joe Wicentowski <joewiz at gmail.com> a écrit :
> >
> > Hi all,
> >
> > Is there an efficient way to transform entries in a map into two arrays,
> one containing the keys and one containing the values?  Here's my attempt:
> >
> > ```
> > xquery version "3.1";
> >
> > let $letters-numbers := map { "a": 1, "b": 2, "c": 3 }
> > return
> >     (
> >         array { map:keys($letters-numbers) },
> >         array { $letters-numbers?* }
> >     )
> > ```
> >
> > This successfully takes `map { "a": 1, "b": 2, "c": 3 }` and returns
> (["a", "b", "c"], [1, 2, 3]), but the way it iterates through the map twice
> strikes me as somewhat inefficient.  Is there a better way to reduce this
> to a single pass through the map, or is this actually the best approach?
> >
> > Joe
> > _______________________________________________
> > talk at x-query.com
> > http://x-query.com/mailman/listinfo/talk
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://x-query.com/pipermail/talk/attachments/20170715/268d8ede/attachment.html>


More information about the talk mailing list