0

I have an array of objects data, i need to group each object based on the date, once its grouped i need to return an chunk of array that was grouped.

See the below data

//input
var arr = [{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample1" },
{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample2" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample3" },
{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample4" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample5" },
{ id: 5, date: "2018-07-08T07:00:00Z", data: "Sample6" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample7" },
{ id: 5, date: "2018-10-08T07:00:00Z", data: "Sample8" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample9" },
{ id: 5, date: "2018-07-05T07:00:00Z", data: "Sample10" }]


//expected grouping
var arr1 = [{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample1" },
{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample2" },
{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample4" }]

var arr2 = [{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample3" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample5" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample7" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample9" }]

var arr3 = [{ id: 5, date: "2018-07-05T07:00:00Z", data: "Sample10" }]

var arr4 = [{ id: 5, date: "2018-10-08T07:00:00Z", data: "Sample6" },
{ id: 5, date: "2018-10-08T07:00:00Z", data: "Sample8" }]

//expected output

var array1 = ["Sample1", "Sample2", "Sample4"]
var array2 = ["Sample3", "Sample5", "Sample7", "Sample9"]
var array3 = ["Sample10"]
var array4 = ["Sample6", "Sample8"]


 var groupedData = _.groupBy(arr, "date");
 console.log(groupedData)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

using lodash i have achieved this much

var groupedData = _.groupBy(arr, "date");
var keys = _.keys(groupedData)

console.log(groupedData)

upto grouping its working fine. how can i chain a method and return array of chunk

Learner
  • 8,379
  • 7
  • 44
  • 82

3 Answers3

1

You can simplify your code like this.

var arr = [{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample1" },
{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample2" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample3" },
{ id: 5, date: "2018-09-29T07:00:00Z", data: "Sample4" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample5" },
{ id: 5, date: "2018-07-08T07:00:00Z", data: "Sample6" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample7" },
{ id: 5, date: "2018-10-08T07:00:00Z", data: "Sample8" },
{ id: 5, date: "2018-08-18T07:00:00Z", data: "Sample9" },
{ id: 5, date: "2018-07-05T07:00:00Z", data: "Sample10" }]

const obj = {};
arr.forEach(a => {
  if (obj[a.date]) {
    obj[a.date].push(a.data);
  } else {
    obj[a.date] = [a.data];
  }
});
console.log(obj);
Joven28
  • 769
  • 3
  • 12
0

There may be a more elegant way to achieve this, but I would create new arrays and use a method similar to the one described here: Group array items using object

Barry Piccinni
  • 1,685
  • 12
  • 23
0
function group(arr){

    var dates = [];
    var output = [];

    for(var i=0; i<arr.length; i+=1){
        var date = arr[i].date;
        if(!dates.includes(date)) dates.push(date);
    }

    for(var i=0; i<dates.length; i+=1){
        var date = dates[i];
        var tempArr = [];

        for(var j=0; j<arr.length; j+=1)    
            if(date == arr[j].date) tempArr.push(arr[j].data);

        output.push(tempArr);
    }

    return output;
}
blahh
  • 47
  • 12