JavaScript:如何使用deepmerge从数组中删除元素
解决deepmerge数组累加而非替换的问题
你遇到的是deepmerge默认的数组合并行为——它默认会把两个数组**拼接(concat)**在一起,所以才会出现重复元素的情况。不过不用担心,deepmerge本身支持自定义数组合并策略,完全不用重写整个函数就能满足你的需求。
方案1:直接用目标数组替换源数组(匹配你的期望输出)
如果你的需求是让b中的数组完全覆盖a中的对应数组,只需要在调用dp时传入自定义的arrayMerge选项:
const dp = require('deepmerge'); const a = { moderation: { administrator_roleIds: [ '863696108285591562', '851483467047763978' ] } }; const b = { moderation: { administrator_roleIds: [ '863696108285591562' ] } }; const mergedResult = dp(a, b, { // 自定义数组合并逻辑:直接返回b中的数组,覆盖a的原数组 arrayMerge: (destArray, srcArray) => srcArray }); console.log(mergedResult); // 输出:{ moderation: { administrator_roleIds: [ '863696108285591562' ] } }
这里的arrayMerge函数接收两个参数:destArray是a中的原数组,srcArray是b中的目标数组,我们直接返回srcArray就实现了完全替换的效果,完美匹配你要的期望输出。
方案2:合并后去重(扩展场景)
如果你之后有合并数组并保留唯一元素的需求,也可以用这个自定义策略:
const dp = require('deepmerge'); const a = { moderation: { administrator_roleIds: [ '863696108285591562', '851483467047763978' ] } }; const b = { moderation: { administrator_roleIds: [ '863696108285591562' ] } }; const mergedResult = dp(a, b, { arrayMerge: (destArray, srcArray) => { // 合并两个数组后用Set去重,再转回数组 return [...new Set([...destArray, ...srcArray])]; } }); console.log(mergedResult); // 输出:{ moderation: { administrator_roleIds: [ '863696108285591562', '851483467047763978' ] } }
为什么这个方案适合你?
因为你提到必须使用基于deepmerge的函数,这个自定义选项只需要在调用时传入,完全不需要修改原有函数的逻辑,不会增加额外的工作量,完美解决你的痛点。
内容的提问来源于stack exchange,提问作者squarfiuz
相关产品推荐
相关产品推荐

