Come posso trovare valori corrispondenti in due array?

Ho due array e voglio essere in grado di confrontare i due e restituire solo i valori corrispondenti. Ad esempio entrambi gli array hanno il valore cat, quindi è quello che verrà restituito. Non ho trovato nulla di simile. Quale sarebbe il modo migliore per restituire somiglianze?

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 

Naturalmente, il mio approccio consisteva nel fare un ciclo attraverso il primo array una volta e controllare l’indice di ciascun valore nel secondo array. Se l’indice è > -1 , quindi inserirlo nell’array restituito.

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

La mia soluzione non utilizza due cicli come fanno gli altri, quindi potrebbe essere un po ‘più veloce. Se vuoi evitare di usare for..in , puoi prima ordinare entrambi gli array per reindicizzare tutti i loro valori:

 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’utilizzo sarebbe simile a:

 var array1 = ["cat", "sum","fun", "run", "hut"]; var array2 = ["bat", "cat","dog","sun", "hut", "gut"]; console.log(array1.diff(array2)); 

Se si verifica un problema / problema con l’estensione del prototipo di Array, è ansible modificarlo facilmente in una funzione.

 var diff = function(arr, arr2) { 

E cambieresti dovunque la funzione originariamente diceva this per arr2 .

Come menzionato @hanu potresti usare lodash ma puoi anche usare javascript nativi con:

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

Questa funzione viene eseguita in O(n log(n) + m log(m)) rispetto a O(n*m) (come si vede nelle altre soluzioni con loop / indexOf ) che può essere utile se si hanno a che fare con molti valori .

Tuttavia, poiché né "a" > 1"a" < 1 , funziona solo per elementi dello stesso tipo.

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

Esempio:

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

Passare attraverso il secondo array ogni volta che si esegue iterazione su un elemento nel primo array, quindi verificare le corrispondenze.

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

Ho trovato una leggera modifica su ciò che @ jota3 ha suggerito ha funzionato perfettamente per me.

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

Spero che questo ti aiuti!

Le librerie come underscore e lodash hanno un metodo di utilità chiamato intersection per trovare le corrispondenze negli array passati. Dai un’occhiata a: http://underscorejs.org/#intersection

Fatto come una risposta in modo da poter fare la formattazione …

Questo è il processo che devi seguire. Looping attraverso una matrice per le specifiche.

 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 } } } 
 use lodash GLOBAL.utils = require('lodash') var arr1 = ['first' , 'second']; var arr2 = ['second ']; var result = utils.difference (arr1 , arr2); console.log ( "result :" + result ); 

Con alcuni ES6:

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

Questo snippet ordina anche il primo Arr in base all’ordine di defaultArray

piace:

 let firstArr = ['apple', 'kiwi', 'banana']; let defaultArray = ['kiwi', 'apple', 'pear']; ... console.log(sortedArray); // ['kiwi', 'apple']; 
 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; }); 

Se i tuoi valori sono stringhe o numeri non nulli, puoi usare un object come dizionario:

 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; 

Iterare su array1 e trovare l’indice di elemento presente in array2.

 var array1 = ["cat", "sum","fun", "run"]; var array2 = ["bat", "cat","sun", "hut", "gut"]; var str=''; for(var i=0;i