如何获取对象数组中各唯一versionID对应最高versionNR的对象
按versionID分组并保留最高versionNR的对象
我来帮你解决这个问题!你的核心需求是按versionID分组,每组只保留versionNR最大的对象,原来的代码只取了每个分组的第一个元素,所以我们需要调整逻辑来跟踪最大版本号的对象。
jQuery 解决方案
var arr = [{ "id": 1, "versionID": 1, "versionNR": 1, "format": "<div><label for=\"Part_1\">Part 1</label><input data-id=\"1\" id=\"Part_1\" type=\"checkbox\" /></div>" }, { "id": 65, "versionID": 65, "versionNR": 1, "format": "<div><label for=\"Part_65\">Part 2</label><input data-id=\"65\" id=\"Part_65\" type=\"checkbox\" /></div>" }, { "id": 92, "versionID": 1, "versionNR": 2, "format": "<div><label for=\"Part_92\">Part 1</label><input data-id=\"92\" id=\"Part_92\" type=\"checkbox\" /></div>" }, { "id": 93, "versionID": 65, "versionNR": 2, "format": "<div><label for=\"Part_93\">Part 2</label><input data-id=\"93\" id=\"Part_93\" type=\"checkbox\" /></div>" }, { "id": 96, "versionID": 65, "versionNR": 3, "format": "<div><label for=\"Part_96\">Part 2</label><input data-id=\"96\" id=\"Part_96\" type=\"checkbox\" /></div>" }]; var result = {}; $.each(arr, function(i, el) { // 要么当前versionID未记录,要么当前元素的versionNR更大时,更新记录 if (!result[el.versionID] || el.versionNR > result[el.versionID].versionNR) { result[el.versionID] = el; } }); // 将结果对象转换为数组 var singles = Object.values(result); console.log(singles);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
逻辑说明
- 用
result对象作为临时存储,键是versionID,值是该ID下当前找到的versionNR最大的对象 - 遍历数组时,对每个元素做两个判断:
- 如果这个
versionID还没在result里,直接存入 - 如果已经存在,就比较当前元素的
versionNR和result中对应对象的versionNR,如果更大就替换旧对象
- 如果这个
- 最后用
Object.values()把result中的值提取为数组,就是你要的最终结果
原生JavaScript 解决方案(无需jQuery)
如果你不想依赖jQuery,也可以用原生的reduce方法实现相同逻辑:
const arr = [{ "id": 1, "versionID": 1, "versionNR": 1, "format": "<div><label for=\"Part_1\">Part 1</label><input data-id=\"1\" id=\"Part_1\" type=\"checkbox\" /></div>" }, { "id": 65, "versionID": 65, "versionNR": 1, "format": "<div><label for=\"Part_65\">Part 2</label><input data-id=\"65\" id=\"Part_65\" type=\"checkbox\" /></div>" }, { "id": 92, "versionID": 1, "versionNR": 2, "format": "<div><label for=\"Part_92\">Part 1</label><input data-id=\"92\" id=\"Part_92\" type=\"checkbox\" /></div>" }, { "id": 93, "versionID": 65, "versionNR": 2, "format": "<div><label for=\"Part_93\">Part 2</label><input data-id=\"93\" id=\"Part_93\" type=\"checkbox\" /></div>" }, { "id": 96, "versionID": 65, "versionNR": 3, "format": "<div><label for=\"Part_96\">Part 2</label><input data-id=\"96\" id=\"Part_96\" type=\"checkbox\" /></div>" }]; const result = arr.reduce((acc, el) => { if (!acc[el.versionID] || el.versionNR > acc[el.versionID].versionNR) { acc[el.versionID] = el; } return acc; }, {}); const singles = Object.values(result); console.log(singles);
两种方案最终都会输出你期望的结果:
[{ "id": 92, "versionID": 1, "versionNR": 2, "format": "<div><label for=\"Part_92\">Part 1</label><input data-id=\"92\" id=\"Part_92\" type=\"checkbox\" /></div>" },{ "id": 96, "versionID": 65, "versionNR": 3, "format": "<div><label for=\"Part_96\">Part 2</label><input data-id=\"96\" id=\"Part_96\" type=\"checkbox\" /></div>" }]
内容的提问来源于stack exchange,提问作者user7255640
相关产品推荐
相关产品推荐

