2017-02-13 2 views
0

Учитывая список товаров, отсортированных по убыванию по дате (самая последняя дата при индексе 0). Обратите внимание, что у нас могут не быть данных для всех дат.Эффективная группировка данных на основе даты и дня недели

[ 
    {price: 10, dt: "2017-02-13"}, 
    {price: 25, dt: "2017-02-05"}, 
    {price: 15, dt: "2017-01-15"}, 
    ... 
    .. 
] 

Я пытаюсь сгруппировать эти данные в недели, которые я смог успешно выполнить, используя цикл while.

См Plnkr здесь

Я в настоящее время не в состоянии использовать конструкции, как _.groupBy() вызывают пункт группировки постоянно двигается .. (мы имеем в группу на основе недель и через неделю может быть Mn- Sun или Вт-Mn и т. Д.)

есть ли более элегантное решение?

+0

Возможный дубликат [объекта Javascript group by day, month, year] (http://stackoverflow.com/questions/16700678/javascript-object-group-by-day-month-year) –

+0

Все ли даты в одном и том же год? – ppasler

+0

нет .. они могли бы вернуться на целых 30 лет – runtimeZero

ответ

0

Этот код создает массив массивов, представляющих каждую неделю:

const data = [ 
 
    { price: 10, dt: "2017-02-13" }, 
 
    { price: 10, dt: "2017-02-12" }, 
 
    { price: 10, dt: "2017-02-11" }, 
 
    { price: 25, dt: "2017-02-05" }, 
 
    { price: 15, dt: "2017-01-15" } 
 
] 
 

 
const group = (data) => { 
 
    let date = new Date(data[0].dt) 
 
    date.setTime -= date.getDay() * 24 * 60 * 60 * 1000 
 
    let grup = [] 
 
    let newData = [] 
 
    for (let i in data) { 
 
     const dif = Math.floor(((date - new Date(data[i].dt))/24/1000/60/60)/7) 
 
     if (newData[dif]) { 
 
      newData[dif].push(data[i]) 
 
     } else { 
 
      newData[dif] = [data[i]] 
 
     } 
 
    } 
 
    data.push(grup) 
 
    return newData 
 
} 
 

 
console.log(group(data))

примечание, если данные недели не найдены значения будет определено

+0

, так как у меня есть тысячи элементов в моем наборе данных .. это не будет самым быстрым решением – runtimeZero

Смежные вопросы