对比对象数组筛选删除元素:修改原数组的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
相关产品推荐
相关产品推荐

