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

对比对象数组筛选删除元素:修改原数组的Underscore及原生实现

如何从数组中移除存在于另一个数组的元素并修改原数组?

嘿,这个问题我之前也碰到过!你已经用filter找到了差异元素,但想要直接修改原数组或者覆盖它对吧?没问题,下面给你两种方案——原生JavaScript和Underscore工具库的方法,都能搞定:

一、原生JavaScript方法

1. 直接覆盖原数组(最简单)

其实你之前的filter方法已经能得到目标数组了,只要把返回的结果直接赋值给arr1,就相当于“覆盖”原数组啦!不过要注意你代码里的一个小问题:对象的属性是小写的path,不是大写的Path,写错的话会导致判断失效。修正后的代码如下:

const arr1 = [{path: "path1"}, {path: "path2"}];
const arr2 = [{path: "path1"}];

// 直接覆盖arr1,得到目标数组
arr1 = arr1.filter(obj => !arr2.some(obj2 => obj.path === obj2.path));
console.log(arr1); // 输出: [{path: "path2"}]

2. 原地修改原数组(不创建新数组)

如果你不想创建新数组,想直接在原数组上删除元素,那可以倒序遍历arr1(避免正序遍历删除元素时索引混乱的问题),用splice移除符合条件的元素:

const arr1 = [{path: "path1"}, {path: "path2"}];
const arr2 = [{path: "path1"}];

// 倒序遍历,原地删除元素
for (let i = arr1.length - 1; i >= 0; i--) {
  const currentObj = arr1[i];
  // 判断当前元素是否存在于arr2中
  const existsInArr2 = arr2.some(obj2 => currentObj.path === obj2.path);
  if (existsInArr2) {
    arr1.splice(i, 1); // 从原数组移除当前元素
  }
}
console.log(arr1); // 输出: [{path: "path2"}]

二、Underscore工具库方法

Underscore提供了很多便捷的数组操作方法,这里有两种方式可以实现需求:

1. 使用_.reject结合_.some

_.reject相当于反向的filter,会返回不符合条件的元素,我们可以用它筛选出不在arr2中的元素,然后覆盖arr1:

const arr1 = [{path: "path1"}, {path: "path2"}];
const arr2 = [{path: "path1"}];

arr1 = _.reject(arr1, function(obj) {
  return _.some(arr2, function(obj2) {
    return obj.path === obj2.path;
  });
});
console.log(arr1); // 输出: [{path: "path2"}]

2. 使用_.differenceWith(Underscore 1.9+版本支持)

如果你的Underscore版本是1.9及以上,可以用_.differenceWith,它支持自定义比较函数,专门用来对比两个数组的差异:

const arr1 = [{path: "path1"}, {path: "path2"}];
const arr2 = [{path: "path1"}];

arr1 = _.differenceWith(arr1, arr2, function(a, b) {
  return a.path === b.path; // 自定义比较规则
});
console.log(arr1); // 输出: [{path: "path2"}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:53:09