From d832f4f71ec51e67d4cae2557221ef582818f607 Mon Sep 17 00:00:00 2001 From: Dan Heberden Date: Mon, 21 Mar 2011 12:12:31 -0700 Subject: [PATCH] jQuery.map to iterate over objects with a .length property --- src/core.js | 40 ++++++++++++++++++++-------------------- test/unit/core.js | 12 +++++++----- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/core.js b/src/core.js index a0dd7b5b3..951f1b559 100644 --- a/src/core.js +++ b/src/core.js @@ -704,33 +704,33 @@ jQuery.extend({ return ret; }, - // arg is for internal usage only + // arg is for internal usage only map: function( elems, callback, arg ) { - var ret = [], value, i = 0, - length = elems.length, - // same object detection used in jQuery.each, not full-proof but very speedy. - isObj = length === undefined; - - // the work for the loops - run elems[x] through callback - inLoop = function( key ) { - value = callback( elems[ key ], key, arg ); - + var value, ret = [], + i = 0, + length = elems.length, + // process .length if it's just an object member + isArray = length !== undefined && ( elems[ length - 1 ] || jQuery.isArray( elems ) ); + + // Go through the array, translating each of the items to their + // new value (or values). + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + if ( value != null ) { ret[ ret.length ] = value; } } - // Go thorugh every key on the object - if ( isObj ) { + // Go thorugh every key on the object, + } else { for ( key in elems ) { - inLoop( key ); - } - - // Go through the array, translating each of the items to their - // new value (or values). - } else { - for ( ; i < length; i++ ) { - inLoop( i ); + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } } } diff --git a/test/unit/core.js b/test/unit/core.js index c1ffe10b4..08d80400c 100644 --- a/test/unit/core.js +++ b/test/unit/core.js @@ -608,7 +608,7 @@ test("first()/last()", function() { }); test("map()", function() { - expect(6); + expect(7); same( jQuery("#ap").map(function(){ @@ -630,26 +630,28 @@ test("map()", function() { 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" ); + + // object with length prop + var values = jQuery.map( {a:1,b:2, length:3}, function( v, k ){ + return v; + }); + equals( values.join(""), "123", "Map the values from a hash with a length property to an array" ); var scripts = document.getElementsByTagName("script"); var mapped = jQuery.map( scripts, function( v, k ){ return v; }); - equals( mapped.length, scripts.length, "Map an array(-like) to a hash" ); var flat = jQuery.map( Array(4), function( v, k ){ return k % 2 ? k : [k,k,k];//try mixing array and regular returns }); - equals( flat.join(""), "00012223", "try the new flatten technique(#2616)" ); }); -- 2.39.5