Quel est le moyen le plus rapide/le meilleur de comparer deux tableaux et de restituer la différence? Tout comme array_diff
en PHP. Existe-t-il une fonction simple ou vais-je devoir en créer une via each()
? ou une boucle foreach
?
Démonstration de travailhttp://jsfiddle.net/u9xES/
Bon lien (documentation Jquery): http://docs.jquery.com/Main_Page {vous pouvez rechercher ou lire les API ici}
J'espère que cela vous aidera si vous souhaitez le faire dans JQuery.
L’alerte à la fin affiche le tableau de l’élément inhabituel Array, à savoir la différence entre 2 tableaux.
S'il te plait, sachez si quelque chose me manquait, bravo!
Code
var array1 = [1, 2, 3, 4, 5, 6];
var array2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var difference = [];
jQuery.grep(array2, function(el) {
if (jQuery.inArray(el, array1) == -1) difference.Push(el);
});
alert(" the difference is " + difference); // Changed variable name
Je sais que c'est une vieille question, mais je pensais partager ce petit tour.
var diff = $(old_array).not(new_array).get();
diff
contient maintenant ce qui était dans old_array
qui n'est pas dans new_array
utilisez le trait de soulignement comme:
_.difference(array1,array2)
var arrayDiff = function (firstArr, secondArr) {
var i, o = [], fLen = firstArr.length, sLen = secondArr.length, len;
if (fLen > sLen) {
len = sLen;
} else if (fLen < sLen) {
len = fLen;
} else {
len = sLen;
}
for (i=0; i < len; i++) {
if (firstArr[i] !== secondArr[i]) {
o.Push({idx: i, elem1: firstArr[i], elem2: secondArr[i]}); //idx: array index
}
}
if (fLen > sLen) { // first > second
for (i=sLen; i< fLen; i++) {
o.Push({idx: i, 0: firstArr[i], 1: undefined});
}
} else if (fLen < sLen) {
for (i=fLen; i< sLen; i++) {
o.Push({idx: i, 0: undefined, 1: secondArr[i]});
}
}
return o;
};
/** SUBTRACT ARRAYS **/
function subtractarrays(array1, array2){
var difference = [];
for( var i = 0; i < array1.length; i++ ) {
if( $.inArray( array1[i], array2 ) == -1 ) {
difference.Push(array1[i]);
}
}
return difference;
}
Vous pouvez ensuite appeler la fonction n'importe où dans votre code.
var I_like = ["love", "sex", "food"];
var she_likes = ["love", "food"];
alert( "what I like and she does't like is: " + subtractarrays( I_like, she_likes ) ); //returns "Naughty"!
Cela fonctionne dans tous les cas et évite les problèmes des méthodes ci-dessus. J'espère que cela pourra aider!
De cette façon, vous n'avez pas à vous soucier de savoir si le premier tableau est plus petit que le second.
var arr1 = [1, 2, 3, 4, 5, 6,10],
arr2 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
function array_diff(array1, array2){
var difference = $.grep(array1, function(el) { return $.inArray(el,array2) < 0});
return difference.concat($.grep(array2, function(el) { return $.inArray(el,array1) < 0}));;
}
console.log(array_diff(arr1, arr2));
si vous souhaitez également comparer l'ordre de la réponse, vous pouvez l'étendre à quelque chose comme ceci:
Array.prototype.compareTo = function (array2){
var array1 = this;
var difference = [];
$.grep(array2, function(el) {
if ($.inArray(el, array1) == -1) difference.Push(el);
});
if( difference.length === 0 ){
var $i = 0;
while($i < array1.length){
if(array1[$i] !== array2[$i]){
return false;
}
$i++;
}
return true;
}
return false;
}
Les opérations de type tableau de ce type ne sont pas le point fort de jQuery. Vous devriez envisager une bibliothèque telle que Underscorejs, plus précisément la fonction de différence.
La version courte peut être comme ça:
const diff = (a, b) => b.filter((i) => a.indexOf(i) === -1);
résultat:
diff(['a', 'b'], ['a', 'b', 'c', 'd']);
["c", "d"]
Cela devrait fonctionner avec des tableaux non triés, des valeurs doubles, des ordres et des longueurs différents, tout en vous donnant les valeurs filtrées sous la forme tableau1, tableau2 ou les deux.
function arrayDiff(arr1, arr2) {
var diff = {};
diff.arr1 = arr1.filter(function(value) {
if (arr2.indexOf(value) === -1) {
return value;
}
});
diff.arr2 = arr2.filter(function(value) {
if (arr1.indexOf(value) === -1) {
return value;
}
});
diff.concat = diff.arr1.concat(diff.arr2);
return diff;
};
var firstArray = [1,2,3,4];
var secondArray = [4,6,1,4];
console.log( arrayDiff(firstArray, secondArray) );
console.log( arrayDiff(firstArray, secondArray).arr1 );
// => [ 2, 3 ]
console.log( arrayDiff(firstArray, secondArray).concat );
// => [ 2, 3, 6 ]