如何按属性筛选一组嵌套数据?



问题: 如何按最新效果日期从每个组中过滤/提取对象?

代码示例 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' }
//   ]
// }

我不知道如果你想要一个对象,为什么要简化为一个数组,可能会像这样做:

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

按函数对任何数组进行排序,然后获取最后日期

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]])];
}

最新更新