Clasificando un número en JavaScript -- javascript camp codereview Relacionados El problema

Categorising a number in JavaScript


11
vote

problema

Español

He escrito una función que toma un número y devuelve un valor dependiendo de dónde se encuentra ese número en una escala predefinida. Eso es probablemente un poco confuso, por lo que he puesto el código a continuación y agregó una jsfiddle (aunque podría estar mejor en la consola de desarrollo).

  minus5  

funciona y es bastante actuador, es solo un poco icky. He tratado de idear una mejor solución, pero solo se siente en Ickier. ¿Hay algo que me esté perdiendo eso haría esto un poco mejor? Estaba jugando con poner los tamaños en una matriz para que sean un poco más, Json-Ish, pero luego me perdí.

Original en ingles

I've written a function that takes a number and returns a value depending on where that number lies on a pre-defined scale. That's probably a little confusing so I've put the code below and added a JSFiddle (although you might be better off in the dev console).

var getSize = function(number){         var sizes = {             100 : 'url_t',             240 : 'url_s',             320 : 'url_n',             500 : 'url_m',             640 : 'url_z',             800 : 'url_c',             1024 : 'url_l',         },         result = sizes[100];      for (var size in sizes){         if(number < size){             result = sizes[size];             break;         }         result = sizes[1024];     }     return result; }; getSize(10) // returns url_t getSize(130) // returns url_s getSize(2000) // returns url_l getSize(600) // returns url_z 

It works and it's fairly performant, it's just a bit icky. I've tried to come up with a better solution but it just feels ickier. Is there anything I'm missing that would make this a bit nicer? I was playing about with putting the sizes in an array so they're a little more JSON-ish, but then I got lost.

  
   
   

Lista de respuestas

12
 
vote
vote
La mejor respuesta
 

Es posible que no necesite bucle a través de un objeto, y se basará una declaración simple 998877665555443313 .

  enum4  

Como nota lateral, me parece que las personas usan enum5 Antes de que quieran usar alguna lógica en su 99887766655443316 's en lugar de solo valores codificados duros. Una especie de una buena alternativa a un constructo enum7 y probablemente funcionaría mejor que el bucle sobre un objeto usando un bucle 99887766655443318

aún podría mantener los tamaños en un objeto:

  enum9 

Editar: surge un problema si necesita cambiar el 99887766655443320 para su aplicación. Es por eso que estoy inclinado hacia la primera función, que solo una declaración de conmutación y valores codificados duros.

 

You might not need to loop through an object, and a simple switch statement would suffice.

function getSize(number) {     switch (true) {         case number < 100: return "url_t";         case number < 240: return "url_s";         case number < 320: return "url_n";         case number < 500: return "url_m";         case number < 640: return "url_z";         case number < 800: return "url_c";         default:           return "url_l";     } } 

As a side note, I've seem people use switch (true) before when they want to use some logic in their case's instead of just hard coded values. Kind of a nice alternative to an if-else construct, and would probably perform better than looping over an object using a for-in loop.

You could still keep the sizes in an object:

var sizes = {     100 : 'url_t',     240 : 'url_s',     320 : 'url_n',     500 : 'url_m',     640 : 'url_z',     800 : 'url_c',     1024 : 'url_l' };  function getSize(number) {     switch (true) {         case number < 100: return sizes[100];         case number < 240: return sizes[240];         case number < 320: return sizes[320];         case number < 500: return sizes[500];         case number < 640: return sizes[640];         case number < 800: return sizes[800];         default:           return sizes[1024];     } } 

Edit: A problem arises if you need to change the sizes for your application. That's why I'm leaning towards the first function, which just a switch statement and hard coded values.

 
 
   
   
5
 
vote
  • Su int1 debe tener un Check in el evento extremadamente improbable que alguien decida abusar de prototipos (y en 99887776655443323 , no menos !).
  • Tu sangría es un poco inconsistente.
  • Asignar al int4 variable excesivamente.
  • Algunos valores son codificados duros, pero no deben serlo. Por lo menos, muévelos a una constante en lugar de dejarlos como números mágicos.

Podrías probar algo como lo siguiente:

  int5  

Por cierto, ¿es intencional que int6 devolverá int7 en lugar de int8 ? Si no, simplemente cambie el int9 arriba a un InteractiveGame0 .


revisión . Mejor aún, podemos usar InteractiveGame1 . Esto tiene la ventaja de ser totalmente incumplido en los números mágicos; En su lugar, podemos simplemente cambiar nuestro objeto InteractiveGame2 según sea necesario. Además, esto se ocupa de la preocupación de @ Megawac sobre la enumeración indefinida de InteractiveGame3 .

  InteractiveGame4  
 
  • Your for..in construct should have an Object.hasOwnProperty check in the extremely unlikely event that somebody decides to abuse prototypes (and on Object, no less!).
  • Your indentation is a little inconsistent.
  • You assign to the result variable excessively.
  • Some values are hard-coded, but they shouldn't be. At the very least, move them into a constant instead of leaving them as magic numbers.

You could try something like the following:

var getSize = function(number) {     var MAX_SIZE = 1024;      var result;     var sizes = {         100: 't',         240: 's',         320: 'n',         500: 'm',         640: 'z',         800: 'c',         1024: 'l'     };      for (var size in sizes) {         if (sizes.hasOwnProperty(size)) {             if (number < size) {                 result = sizes[size];                 break;             }         }     }     return "url_" + (result || sizes[MAX_SIZE]); } 

Incidentally, is it intentional that getSize(100) will return url_s instead of url_t? If not, just change the < above to a <=.


Revision. Better yet, we can use Object.keys(). This has the advantage of being entirely unreliant on magic numbers; we can instead just change our sizeMap object as needed. Furthermore, this deals with @megawac's concern about the undefined enumeration of for...in.

var getSize = function(number) {     var result;     var sizeMap = {         100: 't',         240: 's',         320: 'n',         500: 'm',         640: 'z',         800: 'c',         1024: 'l'     };      var sizes = Object.keys(sizeMap).sort(function(a, b) {         return a - b;     });      for (var i = 0; i < sizes.length; i++) {         if (number < sizes[i]) {             result = sizeMap[sizes[i]];             break;         }     }     return "url_" + (result || sizeMap[sizes[sizes.length - 1]]); } 
 
 
 
 
3
 
vote

Bien, primera cosa el orden en que un motor enumera las propiedades del objeto no está garantizado !!! es bastante consistente, pero hay errores de motor y no debes confiar en el comportamiento.

Dicho esto, así es como escribiría su 9988776665544330 . Puede usar Object.keys(sizes) para crear la lista de rangos pero nuevamente: el orden no es gaudenteed. ¿Podrías ordenarlo supongo?

  var getSize = (function() {     var sizes = {         100 : 'url_t',         240 : 'url_s',         320 : 'url_n',         500 : 'url_m',         640 : 'url_z',         800 : 'url_c',         1024 : 'url_l',     };     // Note you can do Object.key(sizes); to create this list     var ranges = [100, 240, 320, 500, 640, 800, 1024];      return function(number) {         for (var i = 0, len = ranges.length; i < len; i++) {             var key = ranges[i];             if (number < key) {                 return sizes[key];             }         }         // otherwise return the largest size         return sizes[key];     }; })();   

Puede ser exagerado, pero también creé el sizes y ranges objeto una vez

 

Alright first thing the order that an engine enumerates object properties is not guaranteed!!! Its pretty consistent but there are engine bugs and you shouldn't rely on the behaviour.

That said, this is how I would write your getSize. You can use Object.keys(sizes) to create the ranges list but again - order isn't gaurenteed. You could sort it I suppose?

var getSize = (function() {     var sizes = {         100 : 'url_t',         240 : 'url_s',         320 : 'url_n',         500 : 'url_m',         640 : 'url_z',         800 : 'url_c',         1024 : 'url_l',     };     // Note you can do Object.key(sizes); to create this list     var ranges = [100, 240, 320, 500, 640, 800, 1024];      return function(number) {         for (var i = 0, len = ranges.length; i < len; i++) {             var key = ranges[i];             if (number < key) {                 return sizes[key];             }         }         // otherwise return the largest size         return sizes[key];     }; })(); 

It may be overkill but I also created the sizes and ranges object once

 
 
       
       
2
 
vote

Iría con una variación en Excelente respuesta de Greg , pero invierte la Mapa de tallas para eliminar los números mágicos:

  var sizes = {     url_t : 100,     url_s : 240,     url_n : 320,     url_m : 500,     url_z : 640,     url_c : 800,     url_l : 1024 };  function getSize(number) {     switch (true) {         case number < sizes.url_t: return 'url_t';         case number < sizes.url_s: return 'url_s';         case number < sizes.url_n: return 'url_n';         case number < sizes.url_m: return 'url_m';         case number < sizes.url_z: return 'url_z';         case number < sizes.url_c: return 'url_c';         default:           return 'url_l';     } }   

O, en lugar del switch , para evitar la repetición de su case Líneas:

  var names = ['url_t', 'url_s', 'url_n', 'url_m', 'url_z', 'url_c', 'url_l'];  function getSize(number) {     for (var i in names) {         var name = names[i];         if (number < sizes[name]) {             return name;         }     }     return names[names.length - 1]; }   

y otra cosa, tenga en cuenta que un 9988776655544339 justo antes del cierre Object.keys(sizes)0 es incorrecto Javascript y puede no funcionar en todos los navegadores y entornos:

  Object.keys(sizes)1  
 

I'd go with a variation on Greg's excellent answer, but I would invert the sizes map to eliminate magic numbers:

var sizes = {     url_t : 100,     url_s : 240,     url_n : 320,     url_m : 500,     url_z : 640,     url_c : 800,     url_l : 1024 };  function getSize(number) {     switch (true) {         case number < sizes.url_t: return 'url_t';         case number < sizes.url_s: return 'url_s';         case number < sizes.url_n: return 'url_n';         case number < sizes.url_m: return 'url_m';         case number < sizes.url_z: return 'url_z';         case number < sizes.url_c: return 'url_c';         default:           return 'url_l';     } } 

Or, instead of the switch, to avoid the repetition of its case lines:

var names = ['url_t', 'url_s', 'url_n', 'url_m', 'url_z', 'url_c', 'url_l'];  function getSize(number) {     for (var i in names) {         var name = names[i];         if (number < sizes[name]) {             return name;         }     }     return names[names.length - 1]; } 

And another thing, keep in mind that a , right before the closing } is incorrect JavaScript and may not work in all browsers and environments:

// incorrect: var sizes = { 1024 : 'url_l', }  // correct: var sizes = { 1024 : 'url_l' } 
 
 
 
 
0
 
vote

No usaré el > Object.keys(sizes)2 Estructura.

Se trata de los bucles, las propiedades del objeto y también las propiedades de su prototipo.

Si esa es su única opción, tiene que usar el HaswnProperty por cada tamaño que verificas para evitar errores posibles.

Yo usaría algo como:

  Object.keys(sizes)3  

y luego el habitual para el bucle.

 

I won't use the for in structure.

It's loops thorught the properties of the object and also the properties of his prototype.

If that's your only choice you have to use the hasOwnProperty for every size you check to avoid posible errors.

I would use something like:

var sizes = {  values: [100,240,320,500,640,800,1024],  names: ['url_t', 'url_s', 'url_n', 'url_m', 'url_z', 'url_c', 'url_l'] }, 

and then the usual for loop.

 
 
     
     

Relacionados problema

3  Función de estilo sortable jquery  ( Jquery sortable style function ) 
Esta es una función de clasificación básica escrita en jQuery que mueve los elementos en la DOM alrededor para crear espacios vacíos para un gotpable (). Como...

2  Limpiando una galería de imágenes rotativas  ( Cleaning up a rotating image gallery ) 
He creado una pequeña galería de imágenes para la web. Me propuse querer 3 cosas. 1. Toda la galería tenía una capacidad de respuesta a nivel básica. 2. La ga...

10  "Stardust" Simulador 2D Gravity - Seguimiento 1: Los planetas  ( Stardust 2d gravity simulator follow up 1 the planets ) 
Este es un seguimiento para el juego de gravedad del simulador 2D pregunta. Desde entonces, he desarrollado mis habilidades de JavaScript, y ahora esto...

3  Página web basada en una muestra de un libro  ( Web page based on a sample from a book ) 
He creado una página web basada en una muestra de un libro. Funciona bien, pero parece haber sido demasiado complicado. dt4 ¿Es posible mejorar la clari...

2  IMACROS BOT para realizar refrescos  ( Imacros bot for performing refreshes ) 
Estoy tratando de simplificar este código. Parece que todo funciona como debería; Sin embargo, cuando en el bucle de actualización de Imacro, parece un poco i...

7  Merge Sort en JavaScript  ( Merge sort in javascript ) 
Implementé este tipo de fusión en JS y noté que para los números de enteros aleatorios es mucho más rápido que la construcción en funciones de tipo de todos l...

7  Elementos de anidación con apendchild  ( Nesting elements with appendchild ) 
Quiero hacer un navegación que se vea así: <nav class="socialmediaicons"> <ul> <li> <a> <img> </a> </li> </ul> </nav> ...

3  Convertir un estado de hash a un objeto JavaScript  ( Converting a state from hash into a javascript object ) 
Este código obtiene un estado desde una parte de hash de una cadena de consulta, convierte la parte de hash a un objeto JavaScript y luego intenta obtener un ...

1  Enviando la página web actual a un sitio de marcadores  ( Submitting the current webpage to a bookmarking site ) 
Me gustaría escuchar sus comentarios sobre el siguiente enlace que permite a los usuarios agregar un enlace a un sitio web. Leí que join()5 es sugerido en...

5  Función de movimiento para un juego  ( Move function for a game ) 
Tengo una función PackageSubpackageSubpackageName6 en este juego que estoy haciendo. Funciona bien, pero me gustaría reducir un poco su tamaño. PackageSu...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos