2016-02-19 3 views
0

J'ai un large éventail de fonctionnalités avec les propriétés p et u. Je veux trouver le plus petit et le plus haut p et u dans le tableau et créer cette déclaration de commutateur dans une boucle. Cela fonctionne environ 99,9% du temps. Toutefois. J'ai un ensemble de données où les valeurs max et min sont identiques, même si les valeurs sont réparties uniformément et que la moyenne n'est pas la même. Stumped.Fallthrough problème dans l'instruction de changement Javascript

  switch(true) { 
       case p > max_p: 
        max_p = p; 
       case u > max_u: 
        max_u = u; 
       case p < min_p: 
        min_p = p; 
       case u < min_u: 
        min_u = u; 
      } 

Je cours à travers la boucle dans Firebug et peut voir que MAX_U a parfois mis à jour si u < MAX_U. Par exemple, u = 0,066, max_u = 0,088. Pycharm me parle d'un problème technique, mais l'énoncé fonctionne bien pour tous les autres jeux de données que je lui propose.

Je peux diviser l'instruction en deux. La perte de performance est mineure mais j'aimerais comprendre comment cela pourrait arriver.

Merci, Dennis

modifier:

divisé en deux ensemble de données fonctionne déclaration tout à fait bien sans interruption dans la déclaration.

  switch(true) { 
       case p > max_p: 
        max_p = p; 
       case p < min_p: 
        min_p = p; 
      } 
      switch(true) { 
       case u > max_u: 
        max_u = u; 
       case u < min_u: 
        min_u = u; 
      } 

edit: J'ai accepté la réponse qui fonctionne, mais je suis toujours perplexe pourquoi quelque chose comme cela se passerait-il.

enter image description here

+1

Pour ce que ça vaut la peine, vous pouvez simplement utiliser [ 'Math.max'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Math/max). 'max_u = Math.max (max_u, u)' –

+3

Vous devriez avoir 'break;' après chaque 'case' sauf si cela a été omis. –

+0

@VinnyMannello mais la rupture ne serait-elle pas un problème puisque je compare 2 propriétés? En outre, la première propriété sera plus grande que la plus petite et plus petite que la plus grande et pourrait aussi être la plus grande ou la plus petite. –

Répondre

3

En supposant que vous avez un tableau d'objets avec u et p propriétés (si j'ai lu correctement à la question), voici une fonction simple qui vous donnera le min/max valeurs que vous voulez et vous enregistrez les problèmes d'utilisation switch et/ou if conditions.

var arr = [ 
{ p: 10, u: 101}, 
{ p: 11, u: 1}, 
{ p: 1, u: 3}, 
{ p: 2, u: 7}, 
{ p: 21, u: 1011}, 
{ p: 6, u: 2}, 
{ p: 2, u: 13} 
] 

function getInt(arr, key, type) { 
    return Math[type].apply(null, arr.map(function (el) { 
    return el[key]; 
    })); 
} 

var min_p = getInt(arr, 'p', 'min'); // 1 
var max_p = getInt(arr, 'p', 'max'); // 21 
var min_u = getInt(arr, 'u', 'min'); // 1 
var max_u = getInt(arr, 'u', 'max'); // 1001 

DEMO

+0

cela fonctionne. Je suis toujours déconcerté pourquoi le commutateur unique n'a pas fonctionné. –

+1

J'ai dû itérer à travers le json de toute façon depuis que je crée des objets de géométrie de chaque objet dans le tableau. à la fin, j'ai juste poussé un parseint et un parsefloat dans deux tableaux, puis j'ai directement appliqué Math.max/min aux tableaux pour obtenir les valeurs max et min. Merci de votre aide. –