如何在两个数组中找到匹配的值?

Mr.*_*1.0 50 javascript arrays

我有两个数组,我希望能够比较两个数组,只返回匹配的值.例如,两个数组都具有值c​​at,因此将返回该值.我还没有找到这样的东西.返回相似之处的最佳方法是什么?

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
Run Code Online (Sandbox Code Playgroud)

jot*_*ta3 91

您可以使用 :

const intersection = array1.filter(element => array2.includes(element));
Run Code Online (Sandbox Code Playgroud)

  • ```const 交集 = array1.filter(element => array2.indexOf(element) !== -1);``` 没有 polyfill。 (5认同)
  • 来自ES6的@Learner,您可以使用 Set 过滤掉重复的值并将其值分散在数组中,如下所示:`const junction = [...new Set(array1.filter(element => array2.includes(element)))] ;` (5认同)
  • 这看起来像最简单,最简洁的答案.不确定为什么它没有被标记为正确的. (3认同)
  • 那是因为并非所有浏览器都支持它,除非您使用 polyfill:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes (3认同)
  • 截至 2019 年 4 月下旬,仅 IE 不提供支持。 (2认同)

jer*_*emy 48

当然,我的方法是循环遍历第一个数组并检查第二个数组中每个值的索引.如果索引是> -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;
};
Run Code Online (Sandbox Code Playgroud)

我的解决方案不会像其他人那样使用两个循环,因此可能运行得更快一些.如果要避免使用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;
};
Run Code Online (Sandbox Code Playgroud)

用法如下:

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

console.log(array1.diff(array2));
Run Code Online (Sandbox Code Playgroud)

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

var diff = function(arr, arr2) {
Run Code Online (Sandbox Code Playgroud)

并且其中FUNC原本说你随时随地更改thisarr2.

  • `.indexOf()`只是移动循环.该方法在内部循环遍历目标数组.(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/indexOf) (2认同)

pha*_*t0m 12

此函数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;
}
Run Code Online (Sandbox Code Playgroud)

例:

var array1 = ["cat", "sum", "fun", "hut"], //modified for additional match
    array2 = ["bat", "cat", "dog", "sun", "hut", "gut"];
intersect_arrays(array1, array2);
>> ["cat", "hut"]
Run Code Online (Sandbox Code Playgroud)


Fre*_*ead 12

我发现@ jota3建议对我来说很有效.

var intersections = array1.filter(e => array2.indexOf(e) !== -1);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 这意味着您使用的是ES2016之前的javascript版本,其中包含().indexOf()将适用于任何版本. (2认同)

0x4*_*2D2 9

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

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"]
Run Code Online (Sandbox Code Playgroud)


har*_*iya 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; 
});
Run Code Online (Sandbox Code Playgroud)


Irf*_*Jip 5

您可以使用 javascript 函数,.find() 正如 MDN 中所说,它将返回第一个为真的。如果找到这样的元素, find立即返回该元素的值。否则, 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)
Run Code Online (Sandbox Code Playgroud)

或者使用.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)
Run Code Online (Sandbox Code Playgroud)