web-dev-qa-db-fra.com

javascript supprimer un tableau d'un tableau

Supposons que nous ayons les tableaux suivants:

a = [1, 2, 3, 4, 5]

et

b = [2, 3]

Comment puis-je soustraire b de a? Donc nous avons c = a - b qui devrait être égal à [1, 4, 5]. La solution jQuery conviendrait également.

24
David Weng

En supposant que vous êtes sur un navigateur qui a Array.prototype.filter et Array.prototype.indexOf , vous pouvez utiliser ceci:

var c = a.filter(function(item) {
    return b.indexOf(item) === -1;
});

Si le navigateur en question ne dispose pas de ces méthodes, vous pourrez peut-être les caler.

43
icktoofay

Pour que le code fonctionne dans tous les navigateurs, vous devez rechercher manuellement chaque élément de b dans a et le supprimer.

var a = [1, 2, 3, 4, 5];
var b = [2, 3];

var result = [], found;
for (var i = 0; i < a.length; i++) {
    found = false;
    // find a[i] in b
    for (var j = 0; j < b.length; j++) {
        if (a[i] == b[j]) {
            found = true;
            break;
        }
    }
    if (!found) {
        result.Push(a[i]);
    }
}
// The array result now contains just the items from a that are not in b

Exemple de travail ici: http://jsfiddle.net/jfriend00/xkBzR/

Et voici une version qui pourrait être plus rapide pour les tableaux de grande taille car elle place tout dans un objet pour les recherches hachées plutôt que pour la recherche par tableau de force brute:

var a = [1, 2, 3, 4, 5];
var b = [2, 3];

function filterArray(src, filt) {
    var temp = {}, i, result = [];
    // load contents of filt into object keys for faster lookup
    for (i = 0; i < filt.length; i++) {
        temp[filt[i]] = true;
    }

    // go through src
    for (i = 0; i < src.length; i++) {
        if (!(src[i] in temp)) {
            result.Push(src[i]);
        }
    }
    return(result);
}

var filtered = filterArray(a, b);

Exemple de travail ici: http://jsfiddle.net/jfriend00/LUcx6/

2
jfriend00

Ceci est une version modifiée de la réponse publiée par @icktoofay.

Dans ES6, nous pouvons utiliser:

Cela simplifiera notre code pour:

var c = a.filter(x => !b.includes(x));

Démo:

var a = [1, 2, 3, 4, 5];
var b = [2, 3];

var c = a.filter(x => !b.includes(x));
console.log(c);

1
Mohammad Usman

Pour ceux qui luttent avec des objets, comme Date, vous découvrirez que deux objets différents ne sont jamais égaux, même s'ils ont les mêmes valeurs, les réponses ci-dessus ne fonctionneraient donc pas. une réponse à ce problème dans ES6.

const c = a.filter(aObject => b.findIndex(bObject => aObject.valueOf() === bObject.valueOf()) === -1)
0
Natividad Lara Diaz

Ici, une implémentation pour try fonctionne dans tous les navigateurs: 

if('filter' in Array == false) {
    Array.prototype.filter = 
        function(callback) {
            if(null == this || void 0 == this) {
                return;
             }
            var filtered = [];
            for(i = 0, len = this.length; i < len; i++) {
                    var tmp = this[i];
                    if(callback(tmp)) {
                        filtered.Push(tmp);
                     }
             }
                return filtered;
       }
  }

a = [1, 2, 3, 4, 5]; 
b = [2, 3]; 

var c = a.filter(function(item) { /*implementation of icktoofay */
    return b.indexOf(item) === -1;
});
0
Kakashi