¿Hay alguna forma rápida de obtener una de un por valor, usando JavaScript?

Tengo un . Usando JavaScript, necesito obtener una específica de la lista de opciones, y todo lo que sé es el valor de la opción. La opción puede o no ser seleccionada.

Aquí está el truco: hay miles de opciones y necesito hacer esto unas cientos de veces en un ciclo. En este momento, recorro el conjunto de “opciones” y busco la opción que quiero. Esto es demasiado lento (en el sentido de que en mi máquina muy rápida el navegador se bloqueó hasta que lo maté después de unos minutos).

¿Hay alguna manera más rápida de hacer esto? Tomaré formas específicas del navegador, pero por supuesto una forma estándar DOM sería agradable.

Lo haría así:

// first, build a reverse lookup var optCount = mySelect.options.length; var reverseLookup = {}; for (var i = 0; i < optCount; i++) { var option = mySelect.options[i]; if (!reverseLookup[option.value]) { // use an array to account for multiple options with the same value reverseLookup[option.value] = []; } // store a reference to the DOM element reverseLookup[option.value].push(option); } // then, use it to find the option var foundOptions = reverseLookup["Value that you are looking for"]; if (foundOptions && foundOptions.length) { alert(foundOptions[0].id); } 

Sugeriría no tener miles de opciones en su selección.

Tal vez podría estructurar sus datos de manera diferente, una selección con miles de entradas parece incorrecta.

Tal vez su aplicación lo requiera, pero no sería el uso típico de este elemento.

Esta es la respuesta de Tomalak con un pequeño ajuste de velocidad. Verá un ciclo while que se itera hacia abajo es más rápido que un ciclo for que se itera. (Soy flojo, así que no proporcionaré el enlace).

 var i = mySelect.options.length - 1; var reverseLookup = {}; while ( i >= 0 ) { var option = mySelect.options[i]; if (!reverseLookup[option.value]) { // use an array to account for multiple options with the same value reverseLookup[option.value] = []; } // store a reference to the DOM element reverseLookup[option.value].push(option); i--; } // then, use it to find the option var foundOptions = reverseLookup["Value that you are looking for"]; if (foundOptions && foundOptions.length) { alert(foundOptions[0].id); } 

no, no, lo estás haciendo de la mejor manera posible. La única otra cosa que puede probar, tal vez una búsqueda más rápida, es dar a cada una de las opciones una etiqueta ID para que pueda buscarlas como un objeto DOM en lugar de recorrer los elementos secundarios de un objeto DOM.

Podría recorrer todas las opciones una vez y colocar todos los elementos en una matriz asociativa. Luego puedes buscar myOptions[valueImLookingFor] .

No he probado esto y no puedo garantizar que sea más rápido / mejor. Pero debería deshacerse de todos esos bucles.

Dependiendo de su configuración y necesidades, también podría generar una matriz de JavaScript en el lado del cliente y colocarla en el marcado en lugar de (o además de) la selección.

Mi sugerencia sería mirar un marco / kit de herramientas como Dojo y su forma de seleccionar nodos DOM .

El kit de herramientas elimina muchas incoherencias del navegador y le permite seleccionar y manipular nodos DOM de forma rápida y fácil.

Creo que puede ser un indicador de que “miles” de elementos en una selección probablemente no sea la mejor experiencia de usuario. Quizás debería considerar tratar de limitar sus listas desplegables a varias que reducen los resultados a medida que el usuario las selecciona.

Con jQuery algo como esto podría ser más rápido:

 $("#idselect option[value='yourval']") 

http://docs.jquery.com/Selectors/attributeEquals#attributevalue