如何使用Lodash的uniqBy对嵌套属性results.results.id去重并保留原结构
使用Lodash的_.uniqBy实现嵌套数组去重并保留原对象结构
没问题,这就给你讲清楚怎么用Lodash的_.uniqBy实现你要的嵌套数组去重,同时完整保留原对象的结构:
核心思路
我们需要针对对象里嵌套的results.results数组,以每个元素的id作为唯一标识进行去重,同时不改动原对象的其他属性(比如time、complete、results.total这些)。
代码实现
首先先定义你的原始对象:
const originalObj = { "time": 100, "complete": true, "results": { "total": 10, "score": 3, "results": [ { "id": 123, "name": "test123" }, { "id": 123, "name": "test4554" } ] } };
方式1:直接修改原对象(会改变原始数据)
如果不需要保留原始数据的纯净性,可以直接对嵌套数组进行赋值替换:
// 使用_.uniqBy,第二个参数传入'id'指定唯一键 originalObj.results.results = _.uniqBy(originalObj.results.results, 'id');
执行后,原对象的results.results数组就会只剩下第一个出现的id=123的元素:[{ "id": 123, "name": "test123" }],其他属性完全保留。
方式2:深拷贝后修改(不污染原始数据)
如果需要保留原始对象不变,建议先用_.cloneDeep深拷贝一份,再对拷贝后的对象进行修改:
// 深拷贝原对象,避免修改原始数据 const processedObj = _.cloneDeep(originalObj); // 对拷贝后的嵌套数组去重 processedObj.results.results = _.uniqBy(processedObj.results.results, 'id');
扩展:保留最后一个出现的重复元素
默认_.uniqBy会保留第一个出现的唯一元素,如果想保留最后一个,可以先反转数组,去重后再反转回来:
const processedObj = _.cloneDeep(originalObj); // 反转数组→去重→再次反转,保留最后一个出现的相同id元素 processedObj.results.results = _.reverse( _.uniqBy(_.reverse([...processedObj.results.results]), 'id') );
这样处理后,results.results会留下[{ "id": 123, "name": "test4554" }]。
内容的提问来源于stack exchange,提问作者R111




