From c8a887af066a62840ec1910604ddb7e0c38728e8 Mon Sep 17 00:00:00 2001 From: Jordan Boesch Date: Sun, 27 Feb 2011 12:47:35 -0600 Subject: [PATCH] Bug 2616; Adding object support to jQuery.map --- src/core.js | 30 ++++++++++++++++++++++-------- test/unit/core.js | 12 +++++------- 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/core.js b/src/core.js index 036b2db6b..3ff120859 100644 --- a/src/core.js +++ b/src/core.js @@ -712,15 +712,29 @@ jQuery.extend({ // arg is for internal usage only map: function( elems, callback, arg ) { - var ret = [], value; - - // Go through the array, translating each of the items to their - // new value (or values). - for ( var i = 0, length = elems.length; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); + var ret = [], + value, + length = elems.length, + // same object detection used in jQuery.each, not full-proof but very speedy. + isObj = length === undefined; + + if ( isObj ) { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } else { + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); - if ( value != null ) { - ret[ ret.length ] = value; + if ( value != null ) { + ret[ ret.length ] = value; + } } } diff --git a/test/unit/core.js b/test/unit/core.js index bce0de0f0..d77e6a976 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -608,7 +608,7 @@ test("first()/last()", function() { }); test("map()", function() { - expect(2);//expect(6); + expect(6); same( jQuery("#ap").map(function(){ @@ -625,26 +625,24 @@ test("map()", function() { q("ap","ap","ap"), "Single Map" ); - - return;//these haven't been accepted yet - + //for #2616 var keys = jQuery.map( {a:1,b:2}, function( v, k ){ return k; - }, [ ] ); + }); equals( keys.join(""), "ab", "Map the keys from a hash to an array" ); var values = jQuery.map( {a:1,b:2}, function( v, k ){ return v; - }, [ ] ); + }); equals( values.join(""), "12", "Map the values from a hash to an array" ); var scripts = document.getElementsByTagName("script"); var mapped = jQuery.map( scripts, function( v, k ){ return v; - }, {length:0} ); + }); equals( mapped.length, scripts.length, "Map an array(-like) to a hash" ); -- 2.39.5