如何按出现次数从目标数组中移除另一数组的对应元素?
解决按次数移除数组元素的问题
嘿,我懂你的困扰!_.difference返回空数组是因为它的逻辑是去重后求差集——它只会看元素是否存在,完全不考虑出现次数。你的两个数组去重后都是["111", "222"],自然找不到差异元素啦。
要实现「按指定次数移除元素」的需求,而且还要保持原数组的顺序的话,这里有个简单的原生JS实现,正好匹配你想要的结果:
const allValues = ["111", "111", "111", "222", "111", "222"]; const removingValues = ["111", "111", "222"]; // 第一步:统计要移除的每个元素的次数 const removeCounter = {}; removingValues.forEach(val => { removeCounter[val] = (removeCounter[val] || 0) + 1; }); // 第二步:遍历原数组,根据计数筛选元素 const remainingValues = []; allValues.forEach(val => { if (removeCounter[val] > 0) { // 如果这个元素还需要移除,就减少计数,不加入结果 removeCounter[val]--; } else { // 否则加入结果数组 remainingValues.push(val); } }); console.log(remainingValues); // 输出:["111", "222", "111"]
逻辑说明:
- 先统计
removingValues里每个元素需要被移除的次数,存在removeCounter对象中; - 遍历原数组
allValues,遇到元素时先检查是否还有剩余的移除次数:- 如果有,就减少对应计数,跳过这个元素;
- 如果没有,就把这个元素加入结果数组。
这样既保证了移除的次数正确,又保留了原数组的元素顺序,完美符合你的需求~
如果想用Lodash简化统计步骤,也可以用_.countBy替代手动统计:
const removeCounter = _.countBy(removingValues);
后面的遍历逻辑完全一样,结果也一致。
内容的提问来源于stack exchange,提问作者willywonka15
相关产品推荐
相关产品推荐

