DataTables: Custom priority sorting

by Dominic Myers

HTML

<link rel="stylesheet" href="//cdn.datatables.net/1.10.19/css/jquery.dataTables.min.css">
<script src="//cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<table id="example" class="display" style="width:100%">
	<thead>
		<tr>
			<th>Name</th>
			<th>Position</th>
			<th>Priority</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>Tiger Nixon</td>
			<td>System Architect</td>
			<td>High</td>
		</tr>
		<tr>
			<td>Garrett Winters</td>
			<td>Accountant</td>
			<td>Medium</td>
		</tr>
		<tr>
			<td>Ashton Cox</td>
			<td>Junior Technical Author</td>
			<td>Low</td>
		</tr>
		<tr>
			<td>Cedric Kelly</td>
			<td>Senior Javascript Developer</td>
			<td>Unprioritized</td>
		</tr>
		<tr>
			<td>Airi Satou</td>
			<td>Accountant</td>
			<td>N/A</td>
		</tr>
		<tr>
			<td>Brielle Williamson</td>
			<td>Integration Specialist</td>
			<td>High</td>
		</tr>
		<tr>
			<td>Herrod Chandler</td>
			<td>Sales Assistant</td>
			<td>N/A</td>
		</tr>
	</tbody>
</table>

JavaScript

var example = $('#example').DataTable({
    columns: [
      null, 
      null, 
      {
        sType : "priority",
        render: function(data,type,row) {
          var retVal = $("<div/>");
          switch(data) {
            case "High":
              retVal = retVal
                .addClass("my-class-"+data.toLowerCase())
                .attr("data-priority", data.toLowerCase())
                .text(data);
              break;
            case "Medium":
              retVal = retVal
                .addClass("my-class-"+data.toLowerCase())
                .attr("data-priority", data.toLowerCase())
                .text(data)
              break;  
            case "Low":
              retVal = retVal
                .addClass("my-class-"+data.toLowerCase())
                .attr("data-priority", data.toLowerCase())
                .text(data)
              break;  
            case "Unprioritized":
              retVal = retVal
                .addClass("my-class-"+data.toLowerCase())
                .attr("data-priority", data.toLowerCase())
                .text(data)
              break;  
            case "N/A":
              retVal = retVal
                .addClass("my-class-notapplicable")
                .attr("data-priority", "notapplicable")
                .text(data)
              break;
          }
          return retVal.prop("outerHTML");
        }
      }
    ]
  });
function getRank(data) {
  switch (data) {
    case "high":
      return 0;
    case "medium":
      return 1;
    case "low":
      return 2;
    case "unprioritized":
      return 3;
    case "notapplicable":
      return 4;
    default:
      throw "Unrecognized priority.";
  }
}
jQuery.extend(jQuery.fn.dataTableExt.oSort, {
    "priority-pre": function ( a ) {
    		return getRank($(a).data("priority"));
    },
    "priority-asc": function( a, b ) {
        return ((a < b) ? -1 : ((a > b) ? 1 : 0));
    },
    "priority-desc": function(a,b) {
        return ((a < b) ? 1...