John Abraham
John Abraham

Reputation: 18781

How to filter a set of nested data by a property?

Question: How can I filter/pluck the object from each group by latests effect date?

code sample On repl.it

const isLatestDate = (prev, test) => {
  return test.effectiveDate > prev.effectiveDate;
};

 var groupedByName = { 
   abc: 
     [ { name: 'abc', effectiveDate: '2016-01-01T00:00:00+00:00' },
       { name: 'abc', effectiveDate: '2016-04-01T00:00:00+00:00' },
       { name: 'abc', effectiveDate: '2016-05-01T00:00:00+00:00' } ],
   abcd: 
     [ { name: 'abcd', effectiveDate: '2016-02-01T00:00:00+00:00' },
       { name: 'abcd', effectiveDate: '2016-09-01T00:00:00+00:00' } ]
  }
// let output = groupedByKeyNames.reduce((acc, item) =>{
//     acc[item]=[acc[item].sort((a,b)=>(new Date(a.effectiveDate))-(new Date(b.effectiveDate))).pop()];
// },{})  
let groupedByKeyNames = Object.keys(groupedByName);

let output = groupedByKeyNames.reduce((acc, item) => {
  // does key exsist
  // yes - skip
  // no - add it.
  if(!acc[item]){
    acc[item] = {};
  }
  acc[item] = groupedByName[item];

  return acc;

  // return acc[item] = item;
}, {});
console.log(output)
// pluck/filter out by latest effectDates



//  EXPECTED OUTPUT
// { 
//   abc: [
//       { name: 'abc', effectiveDate: '2016-05-01T00:00:00+00:00' }
//   ],
//   abcd: [ 
//       { name: 'abcd', effectiveDate: '2016-09-01T00:00:00+00:00' }
//   ]
// }

Upvotes: 0

Views: 44

Answers (2)

Jonas Wilms
Jonas Wilms

Reputation: 138257

I dont know why youre reducing to an array if you want an object, may do sth like this:

let groupedByKeyNames = Object.keys(groupedByName);
// pluck/filter out by latest effectDates
let output = groupedByKeyNames.reduce((acc, item) =>{
    acc[item]=[groupedByName[item].sort((a,b)=>(new Date(a.effectiveDate))-(new Date(b.effectiveDate))).pop()];
    return acc;
},{});

http://jsbin.com/lawumineyu/edit?console

Upvotes: 1

anysite
anysite

Reputation: 148

Sort any array by function then get last date

function getLast(arr){
    var sorted = arr.sort(function(a,b){
        var aDate = new Date(a).getTime(),
             bDate = new Date(b).getTime();
        if(bDate == aDate){
            return 0;
        }
        else{
            return aDate > bDate? -1 : 1;
        }
    });
    //first is lastest
    return sorted[0];
}

var arr = [ 
        { name: 'first', effectiveDate: '2016-02-01T00:00:00+00:00' },
       { name: 'last', effectiveDate: '2016-09-01T00:00:00+00:00' } 
       ];

getLast(arr);//name: 'last', effectiveDate: '2016-09-01T00:00:00+00:00'

//full code

data =  { 
   abc: 
     [ { name: 'abc', effectiveDate: '2016-01-01T00:00:00+00:00' },
       { name: 'abc', effectiveDate: '2016-04-01T00:00:00+00:00' },
       { name: 'abc', effectiveDate: '2016-05-01T00:00:00+00:00' } ],
   abcd: 
     [ { name: 'abcd', effectiveDate: '2016-02-01T00:00:00+00:00' },
       { name: 'abcd', effectiveDate: '2016-09-01T00:00:00+00:00' } ]
  }
var allKeys = Object.keys(data),
newData = {}
for(var i=0; i < allKeys.length;i++){
    newData[allKeys[i]] = [getLast(data[allKeys[i]])];
}

Upvotes: 0

Related Questions