ES5环境下如何生成含(date,shift)唯一组合的JSON数据
解决ES5环境下按(date, shift)组合分组去重的问题
我懂你现在的困扰——在ES5环境里没法用ES6的Set,原来的代码因为对象引用的判断逻辑问题,根本没法实现按date和shift组合去重的需求。先帮你理清楚原来代码的问题,再给你一个可行的ES5方案:
原来代码的问题分析
你原来的代码逻辑有几个关键错误:
- 你用
datas.includes(agendaDatas[i].data)判断,但datas里存的是对象,而agendaDatas[i].data是字符串类型,两者永远不可能匹配; - 就算是判断对象,
includes用的是严格相等(===),两个内容相同但内存地址不同的对象会被认为是不同的,所以includes永远返回false,导致所有元素都被重复添加; - 你的目标是按
date和shift的组合来唯一化,但代码里是分开判断date和shift是否存在,最后还把date和shift拆成单独的对象push进去,完全偏离了需求。
ES5环境下的解决方案
在ES5里,我们可以用一个普通对象作为哈希映射表,通过date+shift的组合字符串作为键,来跟踪已经出现过的组合。具体步骤如下:
- 创建一个空对象用来记录已存在的
date+shift组合; - 遍历原数组,对每个元素生成唯一的组合键;
- 如果这个组合键还没在映射表里,就把当前元素(或仅包含date和shift的对象)加入结果数组,并在映射表里标记该组合已存在。
代码示例
// 假设agendaDatas是你的原始数据数组 var agendaDatas = [ { "date": "2019-07-11", "hour": "12:00", "idAppointmentsHour": 47914218, "shift": "T" }, { "date": "2019-07-11", "hour": "13:00", "idAppointmentsHour": 47914219, "shift": "T" }, { "date": "2019-07-12", "hour": "10:00", "idAppointmentsHour": 47914220, "shift": "M" }, { "date": "2019-07-11", "hour": "14:00", "idAppointmentsHour": 47914221, "shift": "T" } ]; var uniqueMap = {}; var result = []; for (var i = 0; i < agendaDatas.length; i++) { var currentItem = agendaDatas[i]; // 生成唯一组合键,用|分隔避免date或shift包含特殊字符导致冲突 var groupKey = currentItem.date + '|' + currentItem.shift; // 检查该组合是否已存在,hasOwnProperty避免原型链属性干扰 if (!uniqueMap.hasOwnProperty(groupKey)) { // 如果你需要保留原对象的所有属性,就存currentItem;如果只需要date和shift,就存下面的对象 // uniqueMap[groupKey] = { date: currentItem.date, shift: currentItem.shift }; uniqueMap[groupKey] = currentItem; result.push(uniqueMap[groupKey]); } } console.log(result); // 输出结果会是两个对象:2019-07-11+T,2019-07-12+M的组合
代码说明
- 用
date + '|' + shift作为键,是为了避免date或shift中包含-这类字符时,出现键冲突的情况; hasOwnProperty方法确保我们只检查对象自身的属性,不会被原型链上的属性干扰,更安全;- 如果你只需要保留
date和shift两个属性,把uniqueMap[groupKey] = currentItem改成uniqueMap[groupKey] = { date: currentItem.date, shift: currentItem.shift }即可。
内容的提问来源于stack exchange,提问作者mresende
相关产品推荐
相关产品推荐

