You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何使用Lodash的uniqBy对嵌套属性results.results.id去重并保留原结构

使用Lodash的_.uniqBy实现嵌套数组去重并保留原对象结构

没问题,这就给你讲清楚怎么用Lodash的_.uniqBy实现你要的嵌套数组去重,同时完整保留原对象的结构:

核心思路

我们需要针对对象里嵌套的results.results数组,以每个元素的id作为唯一标识进行去重,同时不改动原对象的其他属性(比如timecompleteresults.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

火山引擎 最新活动