Dynamic Property Sort

Using partial-application to generate a property-specific sort comparator.

by Tracy-Gregory Gilmore

JavaScript

const bandsArray = [
	{
		forename: 'Jack',
		surname: 'Bruce',
		band: 'Cream',
	},
	{
		forename: 'Eric',
		surname: 'Clapton',
		band: 'Cream',
	},
	{
		forename: 'Ginger',
		surname: 'Baker',
		band: 'Cream',
	},
	{
		forename: 'Mick',
		surname: 'Fleetwood',
		band: 'Fleetwood Mac',
	},
	{
		forename: 'John',
		surname: 'McVie',
		band: 'Fleetwood Mac',
	},
	{
		forename: 'Christine',
		surname: 'McVie',
		band: 'Fleetwood Mac',
	},
	{
		forename: 'Stevie',
		surname: 'Nicks',
		band: 'Fleetwood Mac',
	},
	{
		forename: 'Billy',
		surname: 'Burnette',
		band: 'Fleetwood Mac',
	},
	{
		forename: 'Rick',
		surname: 'Vito',
		band: 'Fleetwood Mac',
	},
	{
		forename: 'Jim',
		surname: 'Morrison',
		band: 'Doors, The',
	},
	{
		forename: 'Ray',
		surname: 'Manzarek',
		band: 'Doors, The',
	},
	{
		forename: 'Robby',
		surname: 'Krieger',
		band: 'Doors, The',
	},
	{
		forename: 'John',
		surname: 'Densmore',
		band: 'Doors, The',
	},
	{
		forename: 'Patty',
		surname: 'Sullivan',
		band: 'Doors, The',
	},

	{
		forename: 'Brian',
		surname: 'May',
		band: 'Queen',
	},
	{
		forename: 'Roger',
		surname: 'Taylor',
		band: 'Queen',
	},
	{
		forename: 'Freddie',
		surname: 'Mercury',
		band: 'Queen',
	},
	{
		forename: 'John',
		surname: 'Deacon',
		band: 'Queen',
	},
];

function dynamicSortComparator(propertyName) {
	return (objA, objB) => (objA[propertyName] < objB[propertyName] ? -1 : 1);
}

bandsArray.sort(dynamicSortComparator('surname'));
console.log(bandsArray);

bandsArray.sort(dynamicSortComparator('forename'));
console.log(bandsArray);