Всем привет,
ребят помогите пожалуйста, в пятницу уже чердак подтекает, не могу сообразить как можно оптимизировать этот адъ (ниже приведен снипет)? Основные претензии к коду: 1. Много циклов, 2. Выглядит как дерьмо
Итак, снипет берет объект вида:
-KtuKxTh0lS1VWqn8tCb : { commission: 1000, created: 1505287287 }
-KtuLJGRoP1MtBvLkSR9: { commission: 1200, created: 1505287352 }
-KtuP6g0rtvJMQ2YVcHC: { commission: 1500, created: 1505288361 }
на выходе он должен отдать массив сгруппированный по дням месяца (т.е. все записи сделанные в один день должны быть сгруппированы в одном индексе массива). При этом очередность индексов имеет значение, ранние даты находятся в ранних индексах.
Мой сниппет:
let days = { sum: [], date: [] }; // объект куда будем складывать результат
this._iterateByDay(sales.val(), day => { // вызов моего ацкого метода (см.ниже)
let sum = null;
let date = h._moment(day[0].created * 1000).format("ddd"); // просто приводим таймстамп в человечий вид
day.forEach( item => sum += item.commission ); // перебираем все записи в одном дне и подсчитываем сумму
days.sum.push(sum); // заталкиваем результат суммы комиссионных за этот день
days.date.push(date); //дата дня
});
_iterateByDay(sales, callback) {
let arr = [];
h._objToArr(sales).forEach( item => { // объект переводим в массим и итерируем
let index = new Date(item.created * 1000).getDate(); // индекс в результирующем массиве === день месяца
if(typeof arr[index] === 'undefined') { // проверяем мы уже создали индекс с этим днем месяца?
arr[index] = []; // нет? создаем
}
arr[index].push(item); //заталкиваем запись в массив
});
arr.forEach( item => { // снова итерируем
if ( !h._isEmptyObject(item) ) { // индекс может быть пустой если в этот день никто ничего не продал
//да и значения в массиве не обязательно начинаются с 0 позиции
return callback(item); // выполняем коллбэк
}
})
},
Несколько условий:
1. не тащим в проект lodash ради одного вызова groupBy,
2. Не предлагаем менять схему бэкэнда