]> source.dussan.org Git - jquery.git/commitdiff
Allow second argument to be passed to array.indexOf. Fixes #9453.
authortimmywil <tim.willison@thisismedium.com>
Sat, 28 May 2011 16:00:28 +0000 (12:00 -0400)
committertimmywil <timmywillisn@gmail.com>
Mon, 19 Sep 2011 19:42:30 +0000 (15:42 -0400)
src/core.js
test/unit/core.js

index 8d9a94f636653756f417090c99bc30f27c1cde97..8bc3137dd7d2be9ed2d0d436d8bc0b94202467c3 100644 (file)
@@ -682,18 +682,21 @@ jQuery.extend({
                return ret;
        },
 
-       inArray: function( elem, array ) {
-               if ( !array ) {
-                       return -1;
-               }
+       inArray: function( elem, array, i ) {
+               var len;
 
-               if ( indexOf ) {
-                       return indexOf.call( array, elem );
-               }
+               if ( array ) {
+                       if ( indexOf ) {
+                               return indexOf.call( array, elem, i );
+                       }
 
-               for ( var i = 0, length = array.length; i < length; i++ ) {
-                       if ( array[ i ] === elem ) {
-                               return i;
+                       len = array.length;
+                       i = i && i < 0 ? Math.max( 0, len + i ) : 0;
+
+                       for ( ; i < len; i++ ) {
+                               if ( array[ i ] === elem ) {
+                                       return i;
+                               }
                        }
                }
 
index fdf0ceb5ef2082060ce717762fdee18068446136..50157fa48088dac5fdf12785a5fcfa51a7490365 100644 (file)
@@ -627,6 +627,42 @@ test("toArray()", function() {
                "Convert jQuery object to an Array" )
 })
 
+test("inArray()", function() {
+       expect(19);
+
+       var selections = {
+               p:   q("firstp", "sap", "ap", "first"),
+               em:  q("siblingnext", "siblingfirst"),
+               div: q("qunit-testrunner-toolbar", "nothiddendiv", "nothiddendivchild", "foo"),
+               a:   q("mark", "groups", "google", "simon1"),
+               empty: []
+       },
+       tests = {
+               p:    { elem: jQuery("#ap")[0],           index: 2 },
+               em:   { elem: jQuery("#siblingfirst")[0], index: 1 },
+               div:  { elem: jQuery("#nothiddendiv")[0], index: 1 },
+               a:    { elem: jQuery("#simon1")[0],       index: 3 }
+       },
+       falseTests = {
+               p:  jQuery("#liveSpan1")[0],
+               em: jQuery("#nothiddendiv")[0],
+               empty: ""
+       };
+
+       jQuery.each( tests, function( key, obj ) {
+               equal( jQuery.inArray( obj.elem, selections[ key ] ), obj.index, "elem is in the array of selections of its tag" );
+               // Third argument (fromIndex)
+               equal( !!~jQuery.inArray( obj.elem, selections[ key ], 5 ), false, "elem is NOT in the array of selections given a starting index greater than its position" );
+               equal( !!~jQuery.inArray( obj.elem, selections[ key ], 1 ), true, "elem is in the array of selections given a starting index less than or equal to its position" );
+               equal( !!~jQuery.inArray( obj.elem, selections[ key ], -3 ), true, "elem is in the array of selections given a negative index" );
+       });
+
+       jQuery.each( falseTests, function( key, elem ) {
+               equal( !!~jQuery.inArray( elem, selections[ key ] ), false, "elem is NOT in the array of selections" );
+       });
+
+});
+
 test("get(Number)", function() {
        expect(2);
        equals( jQuery("#qunit-fixture p").get(0), document.getElementById("firstp"), "Get A Single Element" );