我试图过滤3个数组的公共元素。但是它没有得到3个数组的公共元素,而是只读取2个数组,而不是第3个数组。下面是我的代码,谢谢:
function commonElementsOfArray(arr1, arr2, arr3) {
return arr1.filter(function (n) {
return arr2.indexOf(n) !== -1;
return arr3.indexOf(n) !== -1;
});
}
我试图过滤3个数组的公共元素。但是它没有得到3个数组的公共元素,而是只读取2个数组,而不是第3个数组。下面是我的代码,谢谢:
function commonElementsOfArray(arr1, arr2, arr3) {
return arr1.filter(function (n) {
return arr2.indexOf(n) !== -1;
return arr3.indexOf(n) !== -1;
});
}
2条答案
按热度按时间svmlkihl1#
正如@Titus提到的,代码中的问题是两个
return
语句-一旦找到第一个return
,过滤函数将退出。但是,在寻找
Array.indexOf
的公共元素的方法中,还有一个问题值得指出,问题是Array.indexOf
是一个O(n)
操作,这意味着将针对arr 2和arr 3的每个元素检查参数。但是如果数组很大,那么这将是一个非常慢的函数。例如,如果每个数组有1,000个条目(n)然后你的函数会取每个元素并与arr 2和arr 3中的所有元素进行比较导致每个元件数千次操作(× 1 m,× 1 n时间复杂度)。另一种方法是创建一个
Map
,并在遍历每个数组时填充它,以跟踪条目被看到的次数。查找值现在具有O(1)
运行时。仍然存在遍历每个数组生成O(n)
的成本,但由于快速查找,这变成了n * 1
操作或O(n)
时间复杂度。nhn9ugyo2#
将OP的代码重构为泛型交集函数如何?该函数实现两个数组的简化交集函数,并通过处理泛型函数(数组类型)参数的
reduce
任务生成两个以上数组的总交集。因此,两个数组的交集将基于OP的代码
filter
方法,但使用includes
而不是indexOf
。泛型
getIntersection
只需要确保其参数的类型安全性、参数太少时的正确返回值以及正确提供的参数数量最少时的交集结果...x一个一个一个一个x一个一个二个x
为了更好地理解整个任务的重构过程,上面示例中
getIntersectionOfTwo
of cause的实现保持简单。在下一个重构步骤中,这个函数也可以被改进,以便更有效地处理大量数组数据,因此可以在
filter
回调中使用基于Map
的查找,而不是在每个filter
迭代中搜索是否是b.includes(n)
。一个三个三个一个