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

Jus*_*tin 35 javascript arrays

给定两个不等长的数组:

var arr1 = ["mike", "sue", "tom", "kathy", "henry"]; //arr1.length = 5
var arr2 = ["howey", "jim", "sue", "jennifer", "kathy", "hank", "alex"]; //arr2.length = 7
Run Code Online (Sandbox Code Playgroud)

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

Pau*_* S. 47

这是一个基于的交叉函数 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"]
Run Code Online (Sandbox Code Playgroud)

您可能还需要考虑以下事项

var arr1 = ['sue', 'sue', 'kathy'],
    arr2 = ['kathy', 'kathy', 'sue'];
Run Code Online (Sandbox Code Playgroud)

以上将给出["sue", "sue", "kathy"].如果您不想复制,可以对此进行进一步过滤.这也可以使结果标准化.即

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

现在添加它将返回与前一个数组(["sue", "kathy"])相同的结果,即使存在重复项.

  • Arghh ..我讨厌`if(条件)返回true;`构造..为什么不`返回条件;`? (8认同)
  • @vp_arth 使发生的事情更明显,如果您决定使用代码,当然可以随意修改它 (2认同)

xda*_*azz 43

你可以使用Array.filter:

var result = arr1.filter(function(n) {
  return arr2.indexOf(n) > -1;
});
Run Code Online (Sandbox Code Playgroud)

  • 为什么不只是`return arr2.indexOf(n) !== -1`?无论哪种方式,您都在创建一个新数组。 (2认同)
  • 这应该标记为已接受的答案 (2认同)

ale*_*lex 21

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

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

var commonValues = _.intersection(arr1, arr2);
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

如果您不想使用库,那么实现它将是微不足道的......

var commonValues = arr1.filter(function(value) { 
                                   return arr2.indexOf(value) > -1;
                               });
Run Code Online (Sandbox Code Playgroud)

jsFiddle.

如果您的目标平台支持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]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

jsFiddle.


Ble*_*der 8

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

var results = [];

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