如何使用JS过滤器过滤重复的值并获取最新的交易对象?

时间:2019-01-11 02:59:44

标签: javascript arrays angular ecmascript-6

使用下面的代码,我能够获得重复,但是我试图通过使用transactionDate属性从每种药物中获取最新对象,下面的代码仅过滤重复的任何想法,如何获取每种药物的最新交易。

main.js

var drugsArray =  [{
  drugName: "ADVIL",
  transactionDate: "2018-12-15"
},{
  drugName: "ADVIL",
  transactionDate: "2018-12-28"
}, 
 {
  drugName: "ATRIPLA",
  transactionDate: "2018-12-05"
},{
  drugName: "ATRIPLA",
  transactionDate: "2018-12-21"
}

];

function getDrugs(data) {

 let filtered = data.reduce((accumulator, current) => {
  if (! accumulator.find(({drugName}) => drugName === current.drugName)) {
    var checkRecentDate = getLatestDateSave(current.transactionDate)
    if(checkRecentDate) {
      accumulator.push(current);
    }

  }
  return accumulator;
}, []);

  console.log(filtered);
}


getDrugs(drugsArray);

使用此功能获取最近的日期对象

function getLatestDateSave(xs) {
   if (xs.length) {
      return xs.reduce(function(m, i) {
         return (i.MeasureDate > m) && i || m;
      }, "").MeasureDate;
   }
 }

预期输出为

result = [{
        drugName: "ADVIL",
        transactionDate: "2018-12-28"
    },
    {
        drugName: "ATRIPLA",
        transactionDate: "2018-12-21"
    }

];

3 个答案:

答案 0 :(得分:4)

您可以使用reduce()方法来解决这个问题。同样,使用您在日期上使用的格式,可以将它们直接作为字符串进行比较。示例:

var drugsArray =  [
    {drugName: "ADVIL", transactionDate: "2018-12-15"},
    {drugName: "ADVIL", transactionDate: "2018-12-28"},
    {drugName: "ATRIPLA", transactionDate: "2018-12-05"},
    {drugName: "ATRIPLA", transactionDate: "2018-12-21"}
];

let result = drugsArray.reduce((res, curr) =>
{
    let exists = res.findIndex(x => x.drugName === curr.drugName);

    if (exists < 0)
        res.push(curr);
    else if (res[exists].transactionDate < curr.transactionDate)
        res[exists].transactionDate = curr.transactionDate;

    return res;
        
}, []);

console.log(result);

答案 1 :(得分:1)

您可以先将交易分组为一个数组对象,然后按降序对日期进行排序并选择第一个:

?

答案 2 :(得分:0)

我所做的是按交易日期然后按名称对数组进行排序。然后,我在此thread中采用了重复过滤器方法,该方法可以过滤出重复集中发现的第一项。

var drugsArray =  [{
  drugName: "ADVIL",
  transactionDate: "2018-12-15"
},{
  drugName: "ADVIL",
  transactionDate: "2018-12-28"
}, 
{
  drugName: "ATRIPLA",
  transactionDate: "2018-12-05"
},{
  drugName: "ATRIPLA",
  transactionDate: "2018-12-21"
},
{
  drugName: "AMBIEN",
  transactionDate: "2018-02-05"
},{
  drugName: "AMBIEN",
  transactionDate: "2018-12-06"
}

];

function getDrugs(){
    const output = drugsArray
    .sort(function(d1, d2){
      return new Date(d1.transactionDate) < new Date(d2.transactionDate) ? 1 : -1;
    })
    .sort(function(d1, d2){
      return d1.drugName < d2.drugName ? -1 : 1;
    })
    .filter(function(value, index, self) { 
        return index === self.findIndex(function(i){
          return i.drugName === value.drugName
        })
    });
    
    return output;
}

console.log(getDrugs());

现在,这仅将日期评估为字符串。在比较之前,您可以先将日期字符串隐式转换为Date对象。

相关问题