无论索引如何,检查数组是否包含共享元素
Check if arrays contain shared elements regardless of index
我想检查两个数组是否共享元素而不考虑顺序。
给出
array A: ['hello', 'how', 'are', 'you']
array B: ['how', 'are', 'hello']
return 会匹配 'hello'、'how' 和 'are'
PHP、array_intersect()
(Check if array contains elements having elements of another array) 似乎有东西,但 JavaScript 没有。
如果值在对象中,我会使用 in
,但它们不是:
if (key in obj) {
}
我也可以对两个数组执行 array.sort()
,但不能保证两个数组具有相同数量的值。因此,即使它们被排序,比较的索引也会关闭。
如何在 JavaScript 中执行此操作?
您可以使用 filter 检查另一个数组中是否存在相同的元素。
var arr1 = ['hello', 'how', 'are', 'you'];
var arr2 = ['how', 'are', 'hello'];
var commonElements = arr1.filter(function(e) {
return arr2.indexOf(e) > -1;
});
console.log(commonElements);
你也可以在数组原型上定义这个函数
Array.prototype.intersection = function(arr) {
return this.filter(function(e) {
return arr.indexOf(e) > -1;
});
};
var arr1 = ['hello', 'how', 'are', 'you'],
arr2 = ['how', 'are', 'hello'];
var commonElements = arr1.intersection(arr2);
console.log(commonElements);
考虑到性能,我会将其中一个数组转换为对象,然后通过遍历另一个来检查交集。
var arr1 = ['hello', 'how', 'are', 'you'];
var arr2 = ['how', 'are', 'hello'];
var set = {};
var intersect = [];
for (var i = 0; i < arr1.length; i++)
set[arr1[i]] = true;
for (var i = 0; i < arr2.length; i++)
if (set[arr2[i]]) intersect.push(arr2[i]);
但是这种方法会忽略数组中的重复项。与筛选和查找解决方案相比,这可能显得冗长。如果您正在处理大型数组的交集,这可能会有所帮助。
在这种方法中,第一个数组被转换成一个映射,以便快速查找。
第二个数组与第一个数组匹配。
复杂度为 O(a) + O(b)。
专业:优雅。
缺点:检测到重叠后继续匹配。
function array_overlap(a, b) {
const lookup = a.reduce((m, n) => (m[n]=true, m), {});
const status = b.reduce((m, n) => (lookup[n] || m), false);
return status;
}
我想检查两个数组是否共享元素而不考虑顺序。
给出
array A: ['hello', 'how', 'are', 'you']
array B: ['how', 'are', 'hello']
return 会匹配 'hello'、'how' 和 'are'
PHP、array_intersect()
(Check if array contains elements having elements of another array) 似乎有东西,但 JavaScript 没有。
如果值在对象中,我会使用 in
,但它们不是:
if (key in obj) {
}
我也可以对两个数组执行 array.sort()
,但不能保证两个数组具有相同数量的值。因此,即使它们被排序,比较的索引也会关闭。
如何在 JavaScript 中执行此操作?
您可以使用 filter 检查另一个数组中是否存在相同的元素。
var arr1 = ['hello', 'how', 'are', 'you'];
var arr2 = ['how', 'are', 'hello'];
var commonElements = arr1.filter(function(e) {
return arr2.indexOf(e) > -1;
});
console.log(commonElements);
你也可以在数组原型上定义这个函数
Array.prototype.intersection = function(arr) {
return this.filter(function(e) {
return arr.indexOf(e) > -1;
});
};
var arr1 = ['hello', 'how', 'are', 'you'],
arr2 = ['how', 'are', 'hello'];
var commonElements = arr1.intersection(arr2);
console.log(commonElements);
考虑到性能,我会将其中一个数组转换为对象,然后通过遍历另一个来检查交集。
var arr1 = ['hello', 'how', 'are', 'you'];
var arr2 = ['how', 'are', 'hello'];
var set = {};
var intersect = [];
for (var i = 0; i < arr1.length; i++)
set[arr1[i]] = true;
for (var i = 0; i < arr2.length; i++)
if (set[arr2[i]]) intersect.push(arr2[i]);
但是这种方法会忽略数组中的重复项。与筛选和查找解决方案相比,这可能显得冗长。如果您正在处理大型数组的交集,这可能会有所帮助。
在这种方法中,第一个数组被转换成一个映射,以便快速查找。
第二个数组与第一个数组匹配。
复杂度为 O(a) + O(b)。
专业:优雅。
缺点:检测到重叠后继续匹配。
function array_overlap(a, b) {
const lookup = a.reduce((m, n) => (m[n]=true, m), {});
const status = b.reduce((m, n) => (lookup[n] || m), false);
return status;
}