- From: <bugzilla@jessica.w3.org>
- Date: Tue, 24 May 2016 16:06:07 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=29660 Bug ID: 29660 Summary: map:remove and array:remove should support removing multiple entries Product: XPath / XQuery / XSLT Version: Candidate Recommendation Hardware: PC OS: All Status: NEW Severity: normal Priority: P2 Component: Functions and Operators 3.1 Assignee: mike@saxonica.com Reporter: josh.spiegel@oracle.com QA Contact: public-qt-comments@w3.org Target Milestone: --- I think it may improve usability if we modify map:remove to take a sequence of key values instead of a single key value. This would make it easier to conditionally remove entries from a map. Consider this map: declare variable $m := map { 0 : "blue", 2 : "red", 4 : "blue", 6 : "green" }; Assume the goal is to remove the "blue" entries without knowing the keys in advance. I came up with two solutions for this. The first uses a recursive user defined function: declare function local:removeAll($m as map(*), $keys) { if (exists($keys)) then local:removeAll(map:remove($m,$keys[1]), tail($keys)) else $m }; local:removeAll($m, map:keys($m)[$m(.) eq "blue"]) Here is another solution that filters and reconstructs: map:merge( for $k in map:keys($m) where $m($k) ne "blue" return map:entry($k, $m($k)) ) It is more succinct and I think more intuitive to use map:remove directly: map:remove($m, map:keys($m)[$m(.) eq "blue"]) If this change makes sense, then I expect we would want to consider making a similar change to array:remove as well. -- You are receiving this mail because: You are the QA Contact for the bug.
Received on Tuesday, 24 May 2016 16:06:14 UTC