js数组如何数组A 与数组B的交集删除掉????

let arr1 = [{
        "value": 1,
        "label": "1111"
    },
    {
        "value": 2,
        "label": "222"
    },
    {
        "value": 3,
        "label": "3333"
    },
    {
        "value": 4,
        "label": "4444"
    }
]

let arr2 =[3,4]

如何把数组arr1中包含arr2的value,的每一项删除掉

最终输出:

[
    {
        "value": 1,
        "label": "1111"
    },
    {
        "value": 2,
        "label": "222"
    }
]

有几种方法

阅读 4.4k
5 个回答
const insect = (array, valuesToRemove) => array.filter(({ value }) => ! valuesToRemove.includes(value))

先要明确,是删除,还是过滤

删除是直接修改原数组,把不需要的除掉。过滤一般是指从原数组中选出来符合条件的元素组成新数组 —— 当然这里选出符合条件的,也可以理解为不选符合相反条件的。

不管怎么样,都需要遍历。

如果是删除,为了避免数组元素删除时对后序元素的影响,最好从后往前遍历

function remove(list, predicate) {
    for (let i = list.length - 1; i >= 0; i--) {
        if (predicate(list[i])) {
            list.splice(i, 1);
        }
    }
}

// 如
remove(arr1, it => arr2.includes(it.value));

如果是过滤,用 filter 就很方便

const result = arr1.filter(it => !arr2.includes(it.value));

操作之后 arr1 还是那些元素,不会变。result 是需要的结果。

要注意的是这个条件和上面那段代码的条件正好相反 —— 毕竟一个是为了删,一个是为了留。

然后要说条件的问题,这里用的是数组提供的 includes() 方法来判断是否存在某个值。本质上这也是一个遍历过程,如果 arr2 的元素不多,这样做并不会有什么性能损失,但是如果 arr2 元素数据非常大,这样遍历的性能损失就大了。这种情况下可以从 arr2 生成一个 Set,然后用 Set 对象来判断,这个检索会快得多。

const arr2Set = new Set(arr2);
const result2 = arr1.filter(it => !arr2Set.has(it.value));
function remove(source, target) {
    for (var i = source.length; i--;) {
        if (~target.indexOf(source[i].value)) {
            source.splice(i, 1);
        }
    }
    return source;
}
console.dir(remove(arr1, arr2));
 let newarr = [];
    arr1.forEach(item => {
      if (!arr2.includes(item.value)) {
        newarr.push(item);
      }
    })
  consloe.log(newarr)
[{
    "value": 1,
    "label": "1111"
},{
    "value": 2,
    "label": "222"
}]

let arr5 = [{

    "value": 1,
    "label": "1111"
},
    {
        "value": 2,
        "label": "222"
    },
    {
        "value": 3,
        "label": "3333"
    },
    {
        "value": 4,
        "label": "4444"
    }
]

let arr6 = [3, 4];
console.log(arr5.filter(it => !arr6.includes(it.value)));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题