UNPKG

@zargu/couchdb-designer

Version:

Create and testing couchdb design document form directory structure.

114 lines (108 loc) 2.82 kB
const byArray = (a,b) => { let index = 0; let relation = 0;//joker(a[index],b[index]); while(relation === 0 && a.length > index && b.length > index){ relation = compareAny(a[index],b[index]); index++; } if(relation === 0){ return a.length - b.length; }else{ return relation; } } const byObject = (a,b) => { let index = 0 let aKeys = Object.keys(a); let bKeys = Object.keys(b); let keyRelation = 0; let valueRelation = 0; while(keyRelation === 0 && valueRelation === 0 && aKeys.length > index && bKeys.length > index){ keyRelation = compareAny(aKeys[index],bKeys[index]); valueRelation = compareAny(a[aKeys[index]],b[bKeys[index]]); index++; } if(keyRelation === 0 && valueRelation === 0){ return aKeys.length - bKeys.length; }else{ if(keyRelation === 0){ return valueRelation; }else{ return keyRelation; } } } const compareAny = (a,b) => { let aType = a === null ? 'null' : Array.isArray(a) ? 'array' : typeof a; let bType = b === null ? 'null' : Array.isArray(b) ? 'array' : typeof b; let sortType = aType+bType; switch(sortType){ case 'nullnull': return 0; case 'nullboolean': case 'nullnumber': case 'nullstring': case 'nullarray': case 'nullobject': return -1; case 'booleannull': return 1; case 'booleanboolean': if(a === b){ return 0; }else if(a){ return 1; }else{ return -1; } case 'booleannumber': case 'booleanstring': case 'booleanarray': case 'booleanobject': return -1; case 'numbernull': case 'numberboolean': return 1; case 'numbernumber': return a-b; case 'numberstring': case 'numberarray': case 'numberobject': return -1; case 'stringnull': case 'stringboolean': case 'stringnumber': return 1; case 'stringstring': if(a === b){ return 0; } if(a > b){ return 1; }else{ return -1; } case 'stringarray': case 'stringobject': return -1; case 'arraynull': case 'arrayboolean': case 'arraynumber': case 'arraystring': return 1; case 'arrayarray': return byArray(a,b); case 'arrayobject': return -1; case 'objectnull': case 'objectboolean': case 'objectnumber': case 'objectstring': case 'objectarray': return 1; case 'objectobject': return byObject(a,b); } } const viewSort = (a,b) => compareAny(a.key, b.key); export default compareAny;