mirror of
https://github.com/jquery/jquery.git
synced 2024-11-23 02:54:22 +00:00
Selector: Implement the uniqueSort
chainable method
Some APIs, like `.prevAll()`, return elements in the reversed order, causing confusing behavior when used with wrapping methods (see gh-5149 for more info) To provide an easy workaround, this commit implements a chainable `uniqueSort` method on jQuery objects, an equivalent of `jQuery.uniqueSort`. Fixes gh-5166 Closes gh-5168
This commit is contained in:
parent
716130e094
commit
5266f23cf4
@ -2,6 +2,7 @@ import jQuery from "../core.js";
|
|||||||
import document from "../var/document.js";
|
import document from "../var/document.js";
|
||||||
import sort from "../var/sort.js";
|
import sort from "../var/sort.js";
|
||||||
import splice from "../var/splice.js";
|
import splice from "../var/splice.js";
|
||||||
|
import slice from "../var/slice.js";
|
||||||
|
|
||||||
var hasDuplicate;
|
var hasDuplicate;
|
||||||
|
|
||||||
@ -87,3 +88,7 @@ jQuery.uniqueSort = function( results ) {
|
|||||||
|
|
||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
jQuery.fn.uniqueSort = function() {
|
||||||
|
return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) );
|
||||||
|
};
|
||||||
|
@ -1923,20 +1923,8 @@ QUnit.test( "find in document fragments", function( assert ) {
|
|||||||
assert.strictEqual( elem.length, 1, "Selection works" );
|
assert.strictEqual( elem.length, 1, "Selection works" );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
QUnit.test( "jQuery.uniqueSort", function( assert ) {
|
function getUniqueSortFixtures() {
|
||||||
assert.expect( 14 );
|
var i,
|
||||||
|
|
||||||
function Arrayish( arr ) {
|
|
||||||
var i = this.length = arr.length;
|
|
||||||
while ( i-- ) {
|
|
||||||
this[ i ] = arr[ i ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Arrayish.prototype = {
|
|
||||||
sliceForTestOnly: [].slice
|
|
||||||
};
|
|
||||||
|
|
||||||
var i, tests,
|
|
||||||
detached = [],
|
detached = [],
|
||||||
body = document.body,
|
body = document.body,
|
||||||
fixture = document.getElementById( "qunit-fixture" ),
|
fixture = document.getElementById( "qunit-fixture" ),
|
||||||
@ -1951,7 +1939,7 @@ QUnit.test( "jQuery.uniqueSort", function( assert ) {
|
|||||||
detached2.appendChild( document.createElement( "li" ) ).id = "detachedChild" + i;
|
detached2.appendChild( document.createElement( "li" ) ).id = "detachedChild" + i;
|
||||||
}
|
}
|
||||||
|
|
||||||
tests = {
|
return {
|
||||||
"Empty": {
|
"Empty": {
|
||||||
input: [],
|
input: [],
|
||||||
expected: []
|
expected: []
|
||||||
@ -1992,15 +1980,61 @@ QUnit.test( "jQuery.uniqueSort", function( assert ) {
|
|||||||
length: 3
|
length: 3
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
jQuery.each( tests, function( label, test ) {
|
QUnit.test( "jQuery.uniqueSort", function( assert ) {
|
||||||
var length = test.length || test.input.length;
|
assert.expect( 14 );
|
||||||
// We duplicate `test.input` because otherwise it is modified by `uniqueSort`
|
|
||||||
|
var fixtures = getUniqueSortFixtures();
|
||||||
|
|
||||||
|
function Arrayish( arr ) {
|
||||||
|
var i = this.length = arr.length;
|
||||||
|
while ( i-- ) {
|
||||||
|
this[ i ] = arr[ i ];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Arrayish.prototype = {
|
||||||
|
sliceForTestOnly: [].slice
|
||||||
|
};
|
||||||
|
|
||||||
|
jQuery.each( fixtures, function( label, fixture ) {
|
||||||
|
var length = fixture.length || fixture.input.length;
|
||||||
|
|
||||||
|
// We duplicate `fixture.input` because otherwise it is modified by `uniqueSort`
|
||||||
// and the second test becomes worthless.
|
// and the second test becomes worthless.
|
||||||
assert.deepEqual( jQuery.uniqueSort( test.input.slice( 0 ) ).slice( 0, length ),
|
assert.deepEqual(
|
||||||
test.expected, label + " (array)" );
|
jQuery.uniqueSort( fixture.input.slice( 0 ) )
|
||||||
assert.deepEqual( jQuery.uniqueSort( new Arrayish( test.input ) ).sliceForTestOnly( 0, length ),
|
.slice( 0, length ),
|
||||||
test.expected, label + " (quasi-array)" );
|
fixture.expected,
|
||||||
|
label + " (array)"
|
||||||
|
);
|
||||||
|
|
||||||
|
assert.deepEqual(
|
||||||
|
jQuery.uniqueSort( new Arrayish( fixture.input ) )
|
||||||
|
.sliceForTestOnly( 0, length ),
|
||||||
|
fixture.expected,
|
||||||
|
label + " (quasi-array)"
|
||||||
|
);
|
||||||
|
} );
|
||||||
|
} );
|
||||||
|
|
||||||
|
QUnit.test( "uniqueSort()", function( assert ) {
|
||||||
|
assert.expect( 28 );
|
||||||
|
|
||||||
|
var fixtures = getUniqueSortFixtures();
|
||||||
|
|
||||||
|
jQuery.each( fixtures, function( label, fixture ) {
|
||||||
|
var length = fixture.length || fixture.input.length,
|
||||||
|
fixtureInputCopy = fixture.input.slice( 0 ),
|
||||||
|
sortedElem = jQuery( fixture.input ).uniqueSort();
|
||||||
|
|
||||||
|
assert.deepEqual( fixture.input, fixtureInputCopy, "Fixture not modified (" + label + ")" );
|
||||||
|
|
||||||
|
assert.deepEqual( sortedElem.slice( 0, length ).toArray(), fixture.expected, label );
|
||||||
|
|
||||||
|
// Chaining
|
||||||
|
assert.ok( sortedElem instanceof jQuery, "chaining" );
|
||||||
|
assert.deepEqual( sortedElem.end().toArray(), fixture.input, label );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user