我有两个数组:
const arr1 = ['abc', 'def', 'ghi', 'jkl'];
const arr2 = ['123', 'abc', 'jkl', '456', '789'];
在没有arr2
元素的情况下返回arr1
的最干净方法是什么?
我猜arr2.filter(x => arr1.indexOf(x) < 0)
可以工作,但是有没有更干净的方法?
答案 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
答案 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)
arr2 = arr2.filter( function( el ) {
return arr1.indexOf( el ) < 0;
});
arr2= arr2.filter( function( el ) {
return !arr1.includes( el );
} );
arr2= arr2.filter( ( el ) => !arr1.includes( el ) );
答案 3 :(得分:0)
嗯...我会用循环来解决这个问题。请记住,filter方法实际上将返回一个新数组,而不会对您实际定位的数组进行任何更改。您可能将不得不遍历arr2并使用条件或include方法检查每个元素以查看arr1中是否也是如此。如果arr2中的元素实际上在arr1中具有副本,则使用splice方法摆脱该元素。请记住要跟踪要测试的索引,以便可以将其传递给splice方法。注意:使用include方法将使您不能在循环中使用循环。但是,我不知道该策略是否会使您胜过O ^ 2。希望这可以帮助。