2
votes

Pourquoi ma fonction de filtre ne fonctionne-t-elle pas? (Javascript)

si le bloc s'exécute correctement. Quel est le problème avec le code?

[4]

Résultat attendu

[16]

Résultat réel:

let arr = [4, -4, 5.8, 1.6];
let newA = arr.filter((x) => {
  if (x > 0 && Number.isInteger(x)) {
    return x * x;
  }
})

console.log(newA);

pourquoi?

p>


2 commentaires

Le Filter doit renvoyer un résultat vrai / faux, ce que vous recherchez est probablement une carte .


Parce que filter attend du prédicat qu'il renvoie un booléen ( true / false ), et que vous retournez x * x qui évalue par exemple à 16 pour votre premier élément qui est une valeur de véracité c'est-à-dire n'est pas filtré de votre jeu de résultats.


5 Réponses :


5
votes

Le code donné fait la partie filtrage, car tout entier quadratique positif est un vérité , mais il ne renvoie pas la nouvelle valeur.

Il semble que vous ayez besoin de deux actions, une pour filtrer et modifier les valeurs filtrées.

Dans ce cas, vous avez besoin de href = "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter" rel = "noreferrer"> Array # filter a > pour obtenir des nombres entiers positifs et Array #map pour une valeur quadratique.

let array = [4, -4, 5.8, 1.6],
    result = array
        .filter(x => x > 0 && Number.isInteger(x))
        .map(x => x * x);

console.log(result);


0 commentaires

0
votes

Je ne suis pas sûr du cas d'utilisation, mais cela ressemble à "obtenir le carré de tous les entiers positifs dans un tableau". Si tel est le cas, le code ci-dessous devrait fonctionner.

let arr3=[4,-4,5.8,1.6];   
let new3 = arr3.filter((x)=>{ 
    return (x>0 && Number.isInteger(x));
}).map(function(y){ 
return y*y;
})

Commencez par extraire la liste de tous les entiers positifs, puis renvoyez le carré de chaque élément de la liste.


0 commentaires

1
votes

La raison est déjà expliquée dans la réponse précédente, vous pouvez utiliser réduire si vous souhaitez utiliser une seule fonction

let arr = [4, -4, 5.8, 1.6];
let newA = arr.reduce(function(accumulator, current) {
  if (current > 0 && Number.isInteger(current)) {
    accumulator.push(current * current);
  }
  return accumulator
}, [])
console.log(newA)


1 commentaires

C'est ainsi que je vais également résoudre le problème ... Il n'est pas nécessaire d'itérer deux fois sur le tableau.



1
votes

Le filtre filtre simplement la valeur et renvoie le résultat booléen. Vous pouvez utiliser map comme ci-dessous,

let arr = [4, -4, 5.8, 1.6];
let newA = arr.filter((x) => x > 0 && Number.isInteger(x))
.map((x) => x * x);

console.log(newA);


0 commentaires

1
votes

Avec la méthode reduction :

let arr = [4, -4, 5.8, 1.6];

let newA = arr.reduce( ( acc, x ) => {
  if ( x > 0 && Number.isInteger(x) ) { acc = acc.concat( [x*x] ) } ;
  return acc;
}, []) ;

console.log(newA);


0 commentaires