Side navigation
#4327 closed bug (invalid)
Opened March 11, 2009 11:35AM UTC
Closed March 12, 2009 11:26PM UTC
Last modified March 13, 2009 10:32AM UTC
jQuery.map doesn't respect arrays
Reported by: | borgar | Owned by: | |
---|---|---|---|
Priority: | major | Milestone: | 1.4 |
Component: | core | Version: | 1.3.2 |
Keywords: | map | Cc: | borgar, flesler |
Blocked by: | Blocking: |
Description
The jQuery map method returns a merged array of values rather than an array of the values returned by the callback. This goes against the convention and implementation of almost every other library and programming language in the world.
In addition, the documentation for this function say: "The [callback] function can return any value." No mention that some return values are handled differently than others. This is at best very misleading.
jQuery test code:
jQuery.map(['a:a','b:b', 'c:c'], function (a) { return a.split(':'); }); // returns: ["a", "a", "b", "b", "c", "c"]
For comparison, same test in different languages:
Javascript:
['a:a','b:b', 'c:c'].map(function(x){ return x.split(':'); }); // returns: [["a", "a"], ["b", "b"], ["c", "c"]]
Python:
map(lambda x: x.split(':'), ['a:a','b:b','c:c']) [['a', 'a'], ['b', 'b'], ['c', 'c']] //returns: [['a', 'a'], ['b', 'b'], ['c', 'c']]
PHP:
function test ($x) { return explode(':', $x); } print_r( array_map( 'test', array('a:a','b:b', 'c:c') ) ); // returns : Array( Array('a','a'), Array('b','b'), Array('c','c') );
Attachments (0)
Change History (4)
Changed March 11, 2009 10:08PM UTC by comment:1
cc: | → borgar, flesler |
---|---|
resolution: | → invalid |
status: | new → closed |
Changed March 12, 2009 12:06PM UTC by comment:2
resolution: | invalid |
---|---|
status: | closed → reopened |
Is there a rationale for doing this? "Because it has always been this way" is not a reason for not fixing it. This logic would not apply to most other issues, or nothing would ever get fixed. If it is on purpose, then what problem is it there to solve?
At the very least, if the keeping this behaviour is desired, then I feel that rather than simply dismissing the ticket, it should be moved to docs so that this obscurity gets documented.
Changed March 12, 2009 11:26PM UTC by comment:3
resolution: | → invalid |
---|---|
status: | reopened → closed |
The documentation states this:
The function can then return the translated value, 'null' (to remove the item), or an array of values - which will be flattened into the full array.
http://docs.jquery.com/Utilities/jQuery.map#arraycallback
Looking at the page history, it appears to be documented this way for more than two years. Changing the long-documented behavior of an interface would probably break existing code.
Changed March 13, 2009 10:32AM UTC by comment:4
Whoops! My bad. I absolutely managed to miss this in the docs.
I guess I am too comfortable with them by now. I was too focused on the documentation for the callback parameter itself, which is what I was quoting the the ticket.
That's on purpose. $.map has been doing that since always.
You can either write your own map, or wrap the returned array into another array.
return [a.split(':')];