2016-04-06 3 views
1

Я новичок в концепциях Lodash и функционального программирования. Итак, у меня есть массив объектов с дневной мудра датой, как это:lodash: агрегирование и уменьшение массива объектов на основе даты

[ 
    { 
     "date": '1-Jan-2015', 
     "count": 4 
    }, 
    { 
     "date": '4-Jan-2015', 
     "count": 3 
    }, 
    { 
     "date": '1-Feb-2015', 
     "count": 4 
    }, 
    { 
     "date": '18-Feb-2015', 
     "count": 10 
    } 
] 

, и я хочу, чтобы уменьшить и агрегировать его таким образом, что я получаю массив объектов, где каждый объект имеет ежемесячные данные вместо день-накрест данные, как это:

[ 
    { 
     "date": 'Jan, 2015', 
     "count": 7 // aggregating the count of January 
    }, 
    { 
     "date": 'Feb, 2015', 
     "count": 14 //aggregating the count of February 
    } 
] 

в настоящее время я в письменном виде очень нечитаемым и запутанный код, полный МФС и ФОРС, которая работает. Тем не менее, я хочу реорганизовать его с помощью lodash. Возможно ли использование lodash? Я огляделся и обнаружил _.reduce и _.groupBy, которые я, вероятно, могу использовать, но сейчас я в тупике и не могу понять, какая хорошая реализация.

+0

А как насчет года? Будет ли это так же? –

+0

Да, год будет таким же. –

ответ

2

Мы можем использовать _.reduce & _.values

var arr = [ 
    { 
     "date": '1-Jan-2015', 
     "count": 4 
    }, 
    { 
     "date": '4-Jan-2015', 
     "count": 3 
    }, 
    { 
     "date": '1-Feb-2015', 
     "count": 4 
    }, 
    { 
     "date": '18-Feb-2015', 
     "count": 10 
    } 
] 

_.values(_.reduce(arr,function(result,obj){ 
    var name = obj.date.split('-'); 
    name = name[1]+', '+name[2]; 
    result[name] = { 
    date:name, 
    count:obj.count + (result[name]?result[name].count:0) 
    }; 
    return result; 
},{})); 
+0

Спасибо большое! :) –

2

Вам не нужно lodash, чтобы достичь того, чего вы хотите, вы можете использовать обычный старый Javascript:

var array = [{ 
    "date": '1-Jan-2015', 
    "count": 4 
}, { 
    "date": '4-Jan-2015', 
    "count": 3 
}, { 
    "date": '1-Feb-2015', 
    "count": 4 
}, { 
    "date": '18-Feb-2015', 
    "count": 10 
}] 

var result = array.reduce(function(ar, item) { 
    var index = item.date.split('-').slice(1,3).join(', ') //getting date Month-Year 
    _item = ar.filter(function(a) { 
    return a.date === index 
    })[0] // getting item if already present in array 

    // getting index of _item if _item is already present in ar 
    indexOf = ar.indexOf(_item) 

    if(indexOf > -1) 
    // we sum the count of existing _item 
    ar[indexOf] = {date: index, count: count: _item.count + item.count } 
    else 
    // item is not yet in the array, we push a new _item 
    ar.push({date: index, count: item.count}) 

    return ar; // return the array as required by reduce 
}, []) // initialize the reduce method with an empty array 

console.log(result) // your array with aggregated dates 

И для удовольствия, версия lodash:

_.values(array.reduce(function(obj, item) { 
    var index = item.date.split('-').slice(1, 3).join(', ') 
    obj[index] = {date: index, count: (obj[index] && obj[index].count || 0) + item.count} 
    return obj 
}, {})) 

См jsfiddle here

+1

Мне нравится забавная версия +1 – JagsSparrow

+0

немного короче на самом деле;) – cl3m

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