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.
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.
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/
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);
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)
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;
});