Filter et opérateur logique AND

Le problème exposé dans ce sujet a été résolu.

Bonjour,

N'étant pas un expert en ES5, est-il possible de filtrer avec la méthode filter un sous tableau avec l'opérateur logique && (AND) ?
Ci-dessous un tableau pour illustrer l'exemple.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
var arr = [
    {
        'id': 1,
        'items': ['a', 'c', 'b']
    },
    {
        'id': 2,
        'items': ['c', 'd']
    },
    {
        'id': 3,
        'items': ['d', 'c', 'b']
    },
    {
        'id': 4,
        'items': ['a', 'b']
    }
];

Je peux filtrer les éléments "items" comme par exemple retourner un tableau comportant le tableau lorsque la valeur vaut "a" ou "b" dans "items".

1
2
3
4
5
6
7
8
9
function MyFilter(element, index, self) {
    for (var i = 0; i < element.items.length; i++) {
        if (element.items[i] == 'a' || element.items[i] == 'b') {
            return element;
        }
    }
}

console.table(arr.filter(MyFilter));

Le filtre fonctionne mais lorsque je remplace l'opérateur logique || (OR) par && (AND), je n'ai aucun résultat :(

Merci d'avance :)

+0 -0

Le filtre fonctionne mais lorsque je remplace l'opérateur logique || (OR) par && (AND), je n'ai aucun résultat 

Bin c'est normal, un element ne peut avoir pour valeur 'a' et 'b' en même temps.

Tu veux obtenir quoi comme sortie ?

Return ne peut retourner qu’une seule et unique valeur dans la même fonction. Dans votre cas, il serait préférable de renvoyer plutôt un tableau stockant les indices 1 et 4.

Ainsi, on pourrait avoir :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function MyFilter(element, index, self) {
    var indexes = [];
    for (var i = 0; i < element.items.length; i++) {
        if (element.items[i] == 'a' || element.items[i] == 'b') {
            indexes.push(element);
        }
    }

    return indexes;
}

Return ne peut retourner qu’une seule et unique valeur dans la même fonction

Son code est bien, pourquoi créer ton propre filtre quand tu as la fonction filter qui fait ça très bien ?

Tu peux faire ça mais autrement ! Regarde ta condition dans ta boucle avec un & : elle est vraie si la valeur de l'item i est égale en même temps à a et à b ce qui est possible.

Tu devrais regarder du coté de la fonction find (voir ici) pour savoir si ton tableau contient bien les différents éléments que tu cherches.

+0 -0

Si j'ai bien compris, le PO cherche simplement à faire ça :

1
2
3
4
5
arr.filter( 
  function(e) {
    return e.items.includes("a") && e.items.includes("b");
  } 
);

C'est donc bien un AND, mais pas au même niveau.

+0 -0

Si j'ai bien compris, le PO cherche simplement à faire ça :

1
2
3
4
5
arr.filter( 
  function(e) {
    return e.items.includes("a") && e.items.includes("b");
  } 
);

C'est donc bien un AND, mais pas au même niveau.

yoch

Yep, c'est aussi ce que j'ai compris. Comme Array.prototype.includes arrivera avec ES2016, en attendant on peut utiliser indexOf:

1
2
3
4
5
arr.filter( 
  function(e) {
    return e.items.indexOf("a") !== -1 && e.items.indexOf("b") !== -1;
  } 
);
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte