157 votes

Comment trouver les valeurs correspondantes dans deux tableaux ?

J'ai deux tableaux, et je veux pouvoir les comparer et ne retourner que les valeurs qui correspondent. Par exemple, les deux tableaux ont la valeur cat c'est donc ce qui sera renvoyé. Je n'ai rien trouvé de tel. Quelle serait la meilleure façon de renvoyer des similitudes ?

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

497voto

jota3 Points 3194

Vous pouvez utiliser :

const intersection = array1.filter(element => array2.includes(element));

65voto

Jeremy Points 4002

Naturellement, mon approche consistait à parcourir le premier tableau en boucle une fois et à vérifier l'index de chaque valeur dans le second tableau. Si l'index est > -1 entonces push sur le tableau retourné.

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

Ma solution n'utilise pas deux boucles comme d'autres le font, elle peut donc fonctionner un peu plus vite. Si vous voulez éviter d'utiliser for..in vous pouvez d'abord trier les deux tableaux pour réindexer toutes leurs valeurs :

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;
};

L'usage serait le suivant :

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

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

Si vous avez un problème avec l'extension du prototype Array, vous pouvez facilement le transformer en fonction.

var diff = function(arr, arr2) {

Et tu changerais n'importe quel endroit où le func disait initialement this a arr2 .

36voto

Fred Read Points 153

J'ai trouvé une légère modification de ce que @jota3 a suggéré qui a fonctionné parfaitement pour moi.

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

J'espère que cela vous aidera !

18voto

phant0m Points 8545

Cette fonction s'exécute dans O(n log(n) + m log(m)) par rapport à O(n*m) (comme dans les autres solutions avec les boucles/ indexOf ), ce qui peut être utile si vous traitez un grand nombre de valeurs.

Toutefois, étant donné que ni l'un ni l'autre "a" > 1 ni "a" < 1 cela ne fonctionne que pour les éléments du même type.

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;
}

Ejemplo:

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

13voto

hardik beladiya Points 140
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; 
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X