115

我有两个数组,我希望能够比较这两个数组并只返回匹配的值。例如,两个数组都有值cat,所以这就是将返回的值。我还没有找到这样的东西。返回相似性的最佳方法是什么?

var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];

//if value in array1 is equal to value in array2 then return match: cat
4

13 回答 13

347

您可以使用 :

const intersection = array1.filter(element => array2.includes(element));
于 2017-10-26T15:00:51.863 回答
61

自然,我的方法是遍历第一个数组一次并检查第二个数组中每个值的索引。如果索引是> -1,则将push其放到返回的数组中。

​Array.prototype.diff = function(arr2) {
    var ret = [];
    for(var i in this) {   
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

​我的解决方案不像其他人那样使用两个循环,因此它可能运行得更快一些。如果您想避免使用for..in,您可以先对两个数组进行排序以重新索引它们的所有值:

Array.prototype.diff = function(arr2) {
    var ret = [];
    this.sort();
    arr2.sort();
    for(var i = 0; i < this.length; i += 1) {
        if(arr2.indexOf(this[i]) > -1){
            ret.push(this[i]);
        }
    }
    return ret;
};

用法如下所示:

var array1 = ["cat", "sum","fun", "run", "hut"];
var array2 = ["bat", "cat","dog","sun", "hut", "gut"];

console.log(array1.diff(array2));

如果您在扩展 Array 原型时遇到问题/问题,您可以轻松地将其更改为函数。

var diff = function(arr, arr2) {

this而且你会改变 func 最初所说的任何地方arr2

于 2012-09-15T00:51:50.050 回答
32

我发现@jota3 的建议对我来说非常有效。

var intersections = array1.filter(e => array2.indexOf(e) !== -1);

希望这可以帮助!

于 2017-11-28T05:28:07.897 回答
15

与(如在其他带有 loops/ 的解决方案中所见)O(n log(n) + m log(m))相比,此函数运行,如果您要处理大量值,这可能很有用。O(n*m)indexOf

但是,因为既不是"a" > 1也不是"a" < 1,这仅适用于相同类型的元素。

function intersect_arrays(a, b) {
    var sorted_a = a.concat().sort();
    var sorted_b = b.concat().sort();
    var common = [];
    var a_i = 0;
    var b_i = 0;

    while (a_i < a.length
           && b_i < b.length)
    {
        if (sorted_a[a_i] === sorted_b[b_i]) {
            common.push(sorted_a[a_i]);
            a_i++;
            b_i++;
        }
        else if(sorted_a[a_i] < sorted_b[b_i]) {
            a_i++;
        }
        else {
            b_i++;
        }
    }
    return common;
}

例子:

var array1 = ["cat", "sum", "fun", "hut"], //modified for additional match
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
intersect_arrays(array1, array2);
>> ["cat", "hut"]
于 2012-09-15T13:14:15.757 回答
12

每次迭代第一个数组中的元素时,循环遍历第二个数组,然后检查匹配项。

var array1 = ["cat", "sum", "fun", "run"],
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];

function getMatch(a, b) {
    var matches = [];

    for ( var i = 0; i < a.length; i++ ) {
        for ( var e = 0; e < b.length; e++ ) {
            if ( a[i] === b[e] ) matches.push( a[i] );
        }
    }
    return matches;
}

getMatch(array1, array2); // ["cat"]
于 2012-09-15T00:48:13.990 回答
9
var array1  = [1, 2, 3, 4, 5, 6];
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var array3 = array2.filter(function(obj) { 
    return array1.indexOf(obj) == -1; 
});
于 2018-07-16T10:44:29.097 回答
6

您可以使用 javascript 函数.find() 正如 MDN 中所说,它将返回第一个为 true 的。如果找到这样的元素,find立即返回该元素的值。否则,查找返回undefined

var array1 = ["cat", "sum", "fun", "run", "cat"];
var array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];

found = array1.find((val, index) => {
  console.log('index', index) // Stops at 0
  return array2.includes(val)
})
console.log(found)

或者使用.filter(),它首先遍历每个元素,然后将结果返回给您。

var array1 = ["cat", "sum", "fun", "run", "cat"];
var array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];

found = array1.filter((val, index) => {
  console.log('index', index) // Stops at array1.length - 1
  return array2.includes(val)
})
console.log(found)

于 2019-01-18T08:19:17.150 回答
3

使用 lodash

GLOBAL.utils = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];

var result = utils.difference(arr1 , arr2);
console.log ( "result :" + result );
于 2015-07-08T10:52:50.180 回答
2

作为答案完成,所以我可以进行格式化......

这是您需要经历的过程。循环遍历数组以获取详细信息。

create an empty array
loop through array1, element by element. {
  loop through array2, element by element {
    if array1.element == array2.element {
      add to your new array
    }
  }
}
于 2012-09-15T00:45:21.683 回答
2

如果您的值是非空字符串或数字,则可以将对象用作字典:

var map = {}, result = [], i;
for (i = 0; i < array1.length; ++i) {
    map[array1[i]] = 1;
}

for (i = 0; i < array2.length; ++i) {
    if (map[array2[i]] === 1) {
        result.push(array2[i]);

        // avoid returning a value twice if it appears twice in array 2
        map[array2[i]] = 0;
    }
}

return result;
于 2012-09-15T00:48:47.497 回答
2

像 underscore 和 lodash 这样的库有一个实用方法调用intersection来查找传入的数组中的匹配项。看看:http ://underscorejs.org/#intersection

于 2016-03-30T20:55:40.667 回答
2

使用一些 ES6:

let sortedArray = [];
firstArr.map((first) => {
  sortedArray[defaultArray.findIndex(def => def === first)] = first;
});
sortedArray = sortedArray.filter(v => v);

此代码段还根据defaultArray的顺序对firstArr进行排序

像:

let firstArr = ['apple', 'kiwi', 'banana'];
let defaultArray = ['kiwi', 'apple', 'pear'];
...
console.log(sortedArray);
// ['kiwi', 'apple'];
于 2018-02-21T13:21:45.630 回答
0

迭代 array1 并找到 array2 中存在的 indexof 元素。

var array1 = ["cat", "sum","fun", "run"];
var array2 = ["bat", "cat","sun", "hut", "gut"];
var str='';
for(var i=0;i<array1.length;i++){
        if(array2.indexOf(array1[i]) != -1){
           str+=array1[i]+' ';
       };
    }
console.log(str)
于 2018-06-02T16:42:56.257 回答