如果满足特定条件,则从javaScript数组中删除重复的对象

问题描述 投票:0回答:2

我有一个包含许多对象(药物)的数组。每个对象有3个键:“Drug1”,“Drug2”和riskkingRate。如果Drug1和Drug2值相同,我如何删除重复的对象(r​​iskkingRate在查找重复项时并不重要)。然后保持具有更高冒险率的对象并移除其他对象。这是一个简单的数组:

var Warfarin = [{
    "Drug1": "Warfarin",
    "Drug2": "vitamin K",
    "riskRating": "C",
}, {
    "Drug": "aspirin",
    "Drug2": "MiFEPRIStone",
    "riskRating": "C",
}, {
    "Drug1": "Warfarin",
    "Drug2": "Omacetaxine",
    "riskRating": "X",
}, {
    "Drug1": "Warfarin",
    "Drug2": "vitamin K",
    "riskRating": "X",
},{
    "Drug1": "Warfarin",
    "Drug2": "vitamin K",
    "riskRating": "A",
}]

在此示例中,对象0,3和4是重复的,对象3具有更高的riskkingRate。 (冒险率X> D> C> B> A)。如何删除对象0和4并保留对象1,2和3.谢谢。

javascript arrays sorting
2个回答
3
投票

你可以这样做:

var weights = ["X", "D", "C", "B", "A"];

var Warfarin = [{
    "Drug1": "Warfarin",
    "Drug2": "vitamin K",
    "riskRating": "C",
}, {
    "Drug": "aspirin",
    "Drug2": "MiFEPRIStone",
    "riskRating": "C",
}, {
    "Drug1": "Warfarin",
    "Drug2": "Omacetaxine",
    "riskRating": "X",
}, {
    "Drug1": "Warfarin",
    "Drug2": "vitamin K",
    "riskRating": "X",
},{
    "Drug1": "Warfarin",
    "Drug2": "vitamin K",
    "riskRating": "A",
}];

var response = Warfarin.sort((v1, v2) => (weights.indexOf(v1.riskRating) - weights.indexOf(v2.riskRating)))
.reduce((a, c)=>{
    if(!a.some(v => (v.Drug1 == c.Drug1 && v.Drug2 == c.Drug2))){
        a.push(c);
    }
    return a;
}, []);

console.log(response);

这样做的第一步是根据对象的riskRating对数组进行排序,这样风险较高的对象将在开始时,然后只是减少数组,不要在结果数组中包含重复项。


3
投票

这是一个没有排序的解决方案,但使用ES6 Map,这将使其在O(n)时间而不是O(nlogn)运行:

const Warfarin = [{"Drug1": "Warfarin","Drug2": "vitamin K","riskRating": "C",}, {"Drug": "aspirin","Drug2": "MiFEPRIStone","riskRating": "C",}, {"Drug1": "Warfarin","Drug2": "Omacetaxine","riskRating": "X",},{"Drug1": "Warfarin","Drug2": "vitamin K","riskRating": "X",},{"Drug1": "Warfarin","Drug2": "vitamin K","riskRating": "A",}];

const result = Array.from(Warfarin.reduce ( (acc, obj) => {
    const key = JSON.stringify([obj.Drug1,obj.Drug2]);
    return !acc.has(key) || acc.get(key).riskRating < obj.riskRating
        ? acc.set(key, obj) : acc; 
}, new Map).values());

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
© www.soinside.com 2019 - 2024. All rights reserved.