Javascript / Typescript-删除另一个数组中存在的数组元素

时间:2020-06-01 03:49:52

标签: javascript typescript ecmascript-6

我有两个数组:

const arr1 = ['abc', 'def', 'ghi', 'jkl'];
const arr2 = ['123', 'abc', 'jkl', '456', '789'];

在没有arr2元素的情况下返回arr1的最干净方法是什么?

我猜arr2.filter(x => arr1.indexOf(x) < 0)可以工作,但是有没有更干净的方法?

4 个答案:

答案 0 :(得分:1)

您可以使用includes进行非常小的优化。

arr2.filter(x => !arr1.includes(x))

请记住,对于大型阵列O(mn),这可能会成为缓慢的操作。您可以使用Set对大型数据集进行优化。

const arr1_set = new Set(arr1) // O(n) space
arr2.filter(x => !arr1_set.has(x)) // O(n) time

此处有更多信息:Computing set intersection in linear time?

答案 1 :(得分:0)

您的代码正确。您也可以使用include方法。确保切换到ES7以使用它。请参阅下面的代码段-

var arr1 = [ 1, 2, 3, 4, 5 ];
var arr2  = [ 4, 5, 6 ];

var difference = arr1.filter(x => !arr2.includes(x));
console.log(difference);

/*
    Output: [ 1, 2, 3]
*/

答案 2 :(得分:0)

  1. 有一个方法调用 Array.filter():
    arr2 = arr2.filter( function( el ) {
                  return arr1.indexOf( el ) < 0;
                  });
  1. 示例方式:
    arr2= arr2.filter( function( el ) {
      return !arr1.includes( el );
    } );
  1. 使用箭头功能:
    arr2= arr2.filter( ( el ) => !arr1.includes( el ) );

答案 3 :(得分:0)

嗯...我会用循环来解决这个问题。请记住,filter方法实际上将返回一个新数组,而不会对您实际定位的数组进行任何更改。您可能将不得不遍历arr2并使用条件或include方法检查每个元素以查看arr1中是否也是如此。如果arr2中的元素实际上在arr1中具有副本,则使用splice方法摆脱该元素。请记住要跟踪要测试的索引,以便可以将其传递给splice方法。注意:使用include方法将使您不能在循环中使用循环。但是,我不知道该策略是否会使您胜过O ^ 2。希望这可以帮助。