Filter et opérateur logique AND

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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 :)

HTTP/1.1 418 I'm a teapot

+0 -0
Staff

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 ?

+3 -0

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;
}
+0 -0

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.

"Il est vraiment regrettable que tous les gens qui savent parfaitement comment diriger un pays soient trop occupés à conduire des taxis et à couper des cheveux"

+0 -0

Cette réponse a aidé l'auteur du sujet

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.

Édité par yoch

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

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

Je parle de JavaScript et d'autres trucs sur mon blog : https://draft.li/blog

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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