我有两个数组,我希望能够比较两者并只返回匹配的值。例如,两个数组都具有值,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
我有两个数组,我希望能够比较两者并只返回匹配的值。例如,两个数组都具有值,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
您可以使用 :
const intersection = array1.filter(element => array2.includes(element));
当然,我的方法是遍历第一个数组一次并检查第二个数组中每个值的索引。如果索引为> -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) {
并且其中FUNC原本说你随时随地更改this到arr2。
我发现@jota3 建议的内容略有改动,对我来说非常有效。
var intersections = array1.filter(e => array2.indexOf(e) !== -1);
希望这可以帮助!
O(n log(n) + m log(m))与O(n*m)(如在其他带有 loops/ 的解决方案中所见)相比,此函数运行,这在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"]
每次迭代第一个数组中的元素时循环遍历第二个数组,然后检查匹配项。
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"]