web-dev-qa-db-fra.com

Comparer 2 tableaux qui renvoie la différence

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?

57
Howdy_McGee

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 
64
Tats_innit

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

137
superphonic

utilisez le trait de soulignement comme:

_.difference(array1,array2)
8
anurag_29
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;
};
3
user235273
/** 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!

3
Kareem

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));
2
Behnam Rasooli

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

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.

1
Jonas Høgh

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"]
0
Maksym Kalin

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 ]
0
Elvis