@zargu/couchdb-designer
Version:
Create and testing couchdb design document form directory structure.
114 lines (108 loc) • 2.82 kB
JavaScript
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;