You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用Lodash在Reducer中实现无重复的条件式数组拼接

解决Reducer中条件式数组拼接(去重)的问题

嘿,我看出来问题出在哪啦~你现在的代码里只是直接把原数组和待拼接对象做了concat,完全没调用Lodash的_.uniqBy方法,所以重复的对象自然会保留下来。下面给你两种可行的解决方案:

方法一:用_.uniqBy直接去重拼接

这是你原本想实现的思路,只需要把concat后的结果传入_.uniqBy,指定id作为判断唯一性的字段即可:

const arr1 = [{id:1, name:'alex'}, {id:2, name:'taylor'}]
const val1 = {id:1, name:'alex'};
// 先拼接数组,再根据id去重
const finalArr = _.uniqBy(arr1.concat(val1), 'id');
const reducer = { finalArr };
console.log('Reducer', reducer);

执行后会得到你期望的输出:

Reducer { finalArr: [ { id: 1, name: 'alex' }, { id: 2, name: 'taylor' } ] }

方法二:先检查再拼接(更高效)

如果数组规模较大,先判断对象是否存在再决定是否拼接,能避免不必要的数组遍历和去重操作:

const arr1 = [{id:1, name:'alex'}, {id:2, name:'taylor'}]
const val1 = {id:1, name:'alex'};

// 用_.some检查数组中是否已存在相同id的对象
const isExists = _.some(arr1, item => item.id === val1.id);
// 不存在则拼接,否则直接复用原数组
const finalArr = isExists ? arr1 : [...arr1, val1]; // 也可以用arr1.concat(val1)

const reducer = { finalArr };
console.log('Reducer', reducer);

注意事项

在Reducer中一定要遵循纯函数的原则:不要修改原数组,而是返回新的数组。concat或者扩展运算符[...arr1, val1]都是创建新数组的安全方式,别用push这类会修改原数组的方法哦~

内容的提问来源于stack exchange,提问作者user3703539

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:39:39