繁体   English   中英

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

[英]remove duplicated objects from javaScript array if meets certain criteria

我有一个包含许多对象(药物)的数组。 每个对象都有3个键:“ Drug1”,“ Drug2”和riskingRate。 如果Drug1和Drug2的值相同,如何删除重复的对象(r​​iskingRate在查找重复项中不重要)。 然后将对象保持较高的riskingRate比率并删除其他对象。 这是一个简单的数组:

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具有较高的riskingRate。 (汇率X> D> C> B> A)。 我如何删除对象0和4,并保留对象1,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对数组进行排序,以便将较高风险的对象放在开头,然后仅缩小数组,而不在结果数组中包含重复项。

这是一个没有排序的解决方案,但是带有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; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM