使用以下代码,我能够获得重复项,但我正在尝试使用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 对象。