2016-04-06 2 views
1

Ich bin neu in Lodash und Functional Programming-Konzepte. So habe ich ein Array von Objekten mit Tag wiese Datum wie diese:lodash: aggregieren und reduzieren Array von Objekten basierend auf Datum

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

und ich möchte reduzieren und aggregieren es so, dass ich ein Array von Objekten, wo jedes Objekt monatliche Daten hat statt Tag weise Daten wie folgt aus:

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

Derzeit habe ich eine schriftliche eine sehr unleserlich und gewundenen Code voller ifs und fors, die funktioniert. Jedoch möchte ich es mit lodash umgestalten. Ist es möglich, lodash zu verwenden? Ich schaute mich um und fand _.reduce und _.groupBy, die ich wahrscheinlich verwenden kann, aber ich bin gerade ratlos und kann eine gute saubere Implementierung nicht herausfinden.

+0

Was ist mit Jahr? Wird es gleich sein? –

+0

ja, Jahr wird gleich sein. –

Antwort

2

Wir können _.reduce & _.values

verwenden
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

Vielen Dank Mann! :) –

2

Sie brauchen nicht lodash zu erreichen, was Sie wollen, können Sie das gute alte Javascript verwenden:

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 

Und für den Spaß, eine lodash Version:

_.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

anzeigen
+1

Ich mag die lustige Version +1 – JagsSparrow

+0

ein bisschen kürzer in der Tat;) – cl3m