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
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
.
Vous pouvez utiliser :
const intersection = array1.filter(element => array2.includes(element));
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"]
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!
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"]
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
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;
});
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'];
use lodash
GLOBAL.utils = require('lodash')
var arr1 = ['first' , 'second'];
var arr2 = ['second '];
var result = utils.difference (arr1 , arr2);
console.log ( "result :" + result );
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
}
}
}
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)
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;
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)