mirror of
				https://github.com/KevinMidboe/zoff.git
				synced 2025-10-29 18:00:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| export default {
 | |
|   methods: {
 | |
|     predicate() {
 | |
|       var fields = [],
 | |
|         n_fields = arguments.length,
 | |
|         field,
 | |
|         name,
 | |
|         cmp;
 | |
| 
 | |
|       var default_cmp = function(a, b) {
 | |
|           if (a == undefined) a = 0;
 | |
|           if (b == undefined) b = 0;
 | |
|           if (a === b) return 0;
 | |
|           return a < b ? -1 : 1;
 | |
|         },
 | |
|         getCmpFunc = function(primer, reverse) {
 | |
|           var dfc = default_cmp,
 | |
|             // closer in scope
 | |
|             cmp = default_cmp;
 | |
|           if (primer) {
 | |
|             cmp = function(a, b) {
 | |
|               return dfc(primer(a), primer(b));
 | |
|             };
 | |
|           }
 | |
|           if (reverse) {
 | |
|             return function(a, b) {
 | |
|               return -1 * cmp(a, b);
 | |
|             };
 | |
|           }
 | |
|           return cmp;
 | |
|         };
 | |
| 
 | |
|       // preprocess sorting options
 | |
|       for (var i = 0; i < n_fields; i++) {
 | |
|         field = arguments[i];
 | |
|         if (typeof field === "string") {
 | |
|           name = field;
 | |
|           cmp = default_cmp;
 | |
|         } else {
 | |
|           name = field.name;
 | |
|           cmp = getCmpFunc(field.primer, field.reverse);
 | |
|         }
 | |
|         fields.push({
 | |
|           name: name,
 | |
|           cmp: cmp
 | |
|         });
 | |
|       }
 | |
| 
 | |
|       // final comparison function
 | |
|       return function(A, B) {
 | |
|         var name, result;
 | |
|         for (var i = 0; i < n_fields; i++) {
 | |
|           result = 0;
 | |
|           field = fields[i];
 | |
|           name = field.name;
 | |
| 
 | |
|           result = field.cmp(A[name], B[name]);
 | |
|           if (result !== 0) break;
 | |
|         }
 | |
|         return result;
 | |
|       };
 | |
|     }
 | |
|   }
 | |
| };
 |