在 JavaScript 中计算两个数组的交集

IT技术 javascript arrays
2021-02-26 21:06:11

给定两个长度不等的数组:

var arr1 = ["mike", "sue", "tom", "kathy", "henry"]; //arr1.length = 5
var arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"]; //arr2.length = 7

如何找到两个数组共有的值?在这种情况下"sue""kathy"应该返回。

4个回答

这是一个基于的交集函数 Array.prototype.filter

function intersect(a, b) {
    var t;
    if (b.length > a.length) t = b, b = a, a = t; // indexOf to loop over shorter
    return a.filter(function (e) {
        return b.indexOf(e) > -1;
    });
}

var arr1 = ["mike", "sue", "tom", "kathy", "henry"];
    arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"];

intersect(arr1, arr2); // ["sue", "kathy"]

您可能还需要考虑以下内容

var arr1 = ['sue', 'sue', 'kathy'],
    arr2 = ['kathy', 'kathy', 'sue'];

以上现在会给["sue", "sue", "kathy"]. 如果您不想重复,您可以对此进行进一步过滤。这也将标准化结果。IE

return a
    .filter(/* .. */) // same as before
    .filter(function (e, i, c) { // extra step to remove duplicates
        return c.indexOf(e) === i;
    });

添加这个现在将返回与之前的数组 ( ["sue", "kathy"])相同的结果,即使有重复。

[1][1,1]它不应该返回 [1] 吗?
2021-05-14 21:06:11
@vp_arth 使发生的事情更明显,如果您决定使用代码,当然可以随意修改它
2021-05-15 21:06:11
感谢 Paul 提供删除欺骗和常规选项,不错的代码。
2021-05-16 21:06:11
如果两个数组之一为空,我不相信这会起作用,它会返回一个误报......我只是做了一个检查,添加了一个 .length 的检查
2021-05-17 21:06:11
啊……我讨厌if (condition) return true;建筑……为什么不return condition;呢?
2021-05-19 21:06:11

你可以使用Array.filter

var result = arr1.filter(function(n) {
  return arr2.indexOf(n) > -1;
});
这应该被标记为已接受的答案
2021-04-22 21:06:11
@Blender 7 年后......“为什么不只是......”传统的 C/C++ 偏执狂。
2021-04-26 21:06:11
为什么不只是return arr2.indexOf(n) !== -1无论哪种方式,您都在制作一个新数组。
2021-05-02 21:06:11
@alex filter() 返回匹配值的数组,而 forEach 不返回任何内容。
2021-05-12 21:06:11

你想找到两个数组的交集吗?

您可以使用 Underscore 的intersection(). 这将为您提供两个数组中存在的值列表。

var commonValues = _.intersection(arr1, arr2);

js小提琴

如果您不想使用库,那么实现就很简单了...

var commonValues = arr1.filter(function(value) { 
                                   return arr2.indexOf(value) > -1;
                               });

js小提琴

如果您的目标平台不支持Array.prototype.filter()Array.prototype.indexOf()不支持...

var commonValues = [];
var i, j;
var arr1Length = arr1.length;
var arr2Length = arr2.length;

for (i = 0; i < arr1Length; i++) {
    for (j = 0; j < arr2Length; j++) {
        if (arr1[i] === arr2[j]) {
            commonValues.push(arr1[i]);
        }
    }
}

js小提琴

阅读本文让我开始思考..如果您在一个/两个数组中多次"sue"出现,交叉的预期结果应该是什么
2021-05-02 21:06:11
@保罗。有趣的想法。我想如果它多次出现在源数组中,这会多次添加它。如果这是一个问题,您可以对结果使用drop duplicates类型的方法(或者在上面的代码中将其分解)。
2021-05-14 21:06:11

迭代其中一个数组并将对象与另一个进行比较:

var results = [];

for (var i = 0; i < arr1.length; i++) {
    if (arr2.indexOf(arr1[i]) !== -1) {
        results.push(arr1[i]);
    }
}