如何使用JS过滤器过滤重复值并获取最新的事务对象



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

主.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"
    }
];

你可以用 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);

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

const 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"
  }
];
// First group the transactions into an object of arrays
const transactionMap = {};
for (const obj of drugsArray) {
  const key = obj.drugName;
  if (!transactionMap[key]) {
    transactionMap[key] = [];
  }
  transactionMap[key].push(obj);
}
// Then sort each group by transaction date and pick the first one
const result = [];
for (const obj in transactionMap) {
  transactionMap[obj].sort(function(a, b) {
    return new Date(b.transactionDate) - new Date(a.transactionDate);
  });
  result.push(transactionMap[obj][0]);
}
console.log(result);

我所做的是按交易日期然后按名称对数组进行排序。然后我在这个线程中采用了重复过滤器方法,该方法过滤掉在重复集中找到的第一个项目。

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 对象。

最新更新