web-dev-qa-db-fra.com

Comment puis-je trouver des valeurs correspondantes dans deux tableaux?

J'ai deux tableaux et je veux pouvoir comparer les deux et ne renvoyer que les valeurs qui correspondent. Par exemple, les deux tableaux ont la valeur cat. C'est ce qui sera retourné. Je n'ai rien trouvé de tel. Quel serait le meilleur moyen de renvoyer des similitudes? 

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

if array1 value is equal to array2 value then return match: cat
36
Mr. 1.0

Naturellement, mon approche consistait à parcourir le premier tableau une fois et à vérifier l'index de chaque valeur du second tableau. Si l'index est > -1, alors Push le 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 les autres, elle peut donc être un peu plus rapide. Si vous souhaitez é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'utilisation ressemblerait à:

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/problème avec l'extension du prototype Array, vous pouvez facilement le changer pour une fonction.

var diff = function(arr, arr2) {

Et vous changeriez n'importe où où la fonction func disait à l'origine this en arr2.

42
jeremy

Vous pouvez utiliser : 

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

Cette fonction est exécutée dans O(n log(n) + m log(m)) par rapport à O(n*m) (comme dans les autres solutions avec boucles/indexOf), ce qui peut être utile si vous utilisez beaucoup de valeurs.

Cependant, étant donné que ni "a" > 1 ni "a" < 1, cela ne fonctionne que pour des é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;
}

Exemple:

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

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

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

J'espère que cela t'aides!

8
Fred Read

Parcourez le deuxième tableau chaque fois que vous parcourez un élément du premier tableau, puis recherchez des correspondances.

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"]
7
0x499602D2

Des bibliothèques telles que underscore et lodash utilisent une méthode appelée intersection pour trouver des correspondances dans les tableaux transmis. Consultez la page: http://underscorejs.org/#intersection

2
leojh
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; 
});
2
hardik beladiya

Avec certains ES6:

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

Cet extrait trie également le firstArr en fonction de l'ordre du defaultArray

comme: 

let firstArr = ['Apple', 'kiwi', 'banana'];
let defaultArray = ['kiwi', 'Apple', 'pear'];
...
console.log(sortedArray);
// ['kiwi', 'Apple'];
1
ddobby94
use lodash 
GLOBAL.utils    = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];

var result = utils.difference (arr1 , arr2);
    console.log ( "result :" + result );
1
hanu

Fait comme réponse pour que je puisse faire le formatage ...

C'est le processus que vous devez suivre. En boucle dans un tableau pour les détails.

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
    }
  }
}
1
Jeremy J Starcher

Vous pouvez utiliser la fonction javascript .find() Comme il est dit dans MDN, le résultat sera première valeur qui est vrai. Si un tel élément est trouvé, find immédiatement renvoie la valeur de cet élément. Sinon, find renvoie undefined.

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

found = array1.find( val => array2.includes(val) )
console.log(found)

0
Irfandy Jip

Si vos valeurs sont des chaînes ou des nombres non nuls, vous pouvez utiliser un objet comme dictionnaire:

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;
0
ChaseMedallion

Itérez sur array1 et recherchez l'indexof de l'élément présent dans array2.

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)
0
Bhalke