[英]remove duplicated objects from javaScript array if meets certain criteria
我有一个包含许多对象(药物)的数组。 每个对象都有3个键:“ Drug1”,“ Drug2”和riskingRate。 如果Drug1和Drug2的值相同,如何删除重复的对象(riskingRate在查找重复项中不重要)。 然后将对象保持较高的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.