groupF = {
const groupByFunction = function(arr) {
const operations = [];
const initialData = arr;
const resultObj = {};
let resultArr;
let sort = function(a, b) {
return a.values.length < b.values.length ? 1 : -1
}
groupByFunction.by = function(groupFuncs) {
const length = arguments.length;
for (let j = 0; j < initialData.length; j++) {
const dataObj = initialData[j];
const keys = [];
for (let i = 0; i < length; i++) {
const key = arguments[i];
keys.push(key(dataObj,j));
}
const strKey = JSON.stringify(keys);
if (!resultObj[strKey]) {
resultObj[strKey] = [];
}
resultObj[strKey].push(dataObj)
}
operations.push('by')
return groupByFunction;
}
groupByFunction.orderBy = function(func) {
sort = function(a, b) {
var a = func(a);
var b = func(b);
if (typeof a === 'string' || a instanceof String) {
return a.localeCompare(b);
}
return a - b;
};
operations.push('orderBy')
return groupByFunction;
}
groupByFunction.orderByDescending = function(func) {
sort = function(a, b) {
var a = func(a);
var b = func(b);
if (typeof a === 'string' || a instanceof String) {
return a.localeCompare(b);
}
return b - a;
};
operations.push('orderByDescending')
return groupByFunction;
}
groupByFunction.sort = function(v) {
sort = v;
operations.push('sort')
return groupByFunction;
}
groupByFunction.run = function() {
operations.forEach(operation=>{
console.log(operation);
})
resultArr = Object
.keys(resultObj)
.map(k => {
const result = {}
const keys = JSON.parse(k);
if (keys.length == 1) {
result.key = keys[0];
} else {
result.keys = keys
}
result.values = resultObj[k]
return result;
});
if (sort) {
resultArr.sort(sort);
}
return resultArr;
}
return groupByFunction;
}
return groupByFunction;
}