@RaulDuke

Как оптимизировать этот js-снипет?

Всем привет,

ребят помогите пожалуйста, в пятницу уже чердак подтекает, не могу сообразить как можно оптимизировать этот адъ (ниже приведен снипет)? Основные претензии к коду: 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. Не предлагаем менять схему бэкэнда
  • Вопрос задан
  • 264 просмотра
Решения вопроса 1
@Ridz
var obj = {"-KtuKxTh0lS1VWqn8tCb" : { commission: 1000, created: 1505287287 },
"-KtuLJGRoP1MtBvLkSR9": { commission: 1200, created: 1505287352 },
"-KtuP6g0rtvJMQ2YVcHC": { commission: 1500, created: 1505288361 }};

function fn(c) {
    return Object.keys(c).sort(function(a, b) {
        return c[b].created - c[a].created
    }).reduce(function(a, b) {
        b = c[b];
        var d = (new Date(1000 * b.created)).toLocaleString("ru", {
            year: "numeric",
            month: "long",
            day: "numeric"
        });
        a.date[0] != d && (a.date.unshift(d), a.sum.unshift(0));
        a.sum[0] += b.commission;
        return a
    }, {
        sum: [],
        date: []
    })
};


 console.log(fn(obj))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы