una - forma más rápida de detectar si un valor está en un grupo de valores en Javascript
pasar parametros a una funcion javascript desde html (8)
Depende de la cantidad de valores que haya.
Si hay algunos valores (menos de 10 a 50), la búsqueda a través de la matriz puede estar bien. Una tabla hash puede ser excesiva.
Si tiene muchos valores, una tabla hash es la mejor opción. Requiere menos trabajo que ordenar los valores y hacer una búsqueda binaria.
Tengo un grupo de cadenas en Javascript y necesito escribir una función que detecta si otra cadena específica pertenece a este grupo o no.
¿Cuál es la forma más rápida de lograr esto? ¿Está bien poner el grupo de valores en una matriz y luego escribir una función que busque a través de la matriz?
Creo que si mantengo los valores ordenados y hago una búsqueda binaria, debería funcionar lo suficientemente rápido. ¿O hay alguna otra forma inteligente de hacerlo, que puede funcionar más rápido?
Puedes usar un objeto así:
// prepare a mock-up object
setOfValues = {};
for (var i = 0; i < 100; i++)
setOfValues["example value " + i] = true;
// check for existence
if (setOfValues["example value 99"]); // true
if (setOfValues["example value 101"]); // undefined, essentially: false
Esto aprovecha el hecho de que los objetos se implementan como matrices asociativas. Lo rápido que eso depende de sus datos y de la implementación del motor de JavaScript, pero puede hacer algunas pruebas de rendimiento fácilmente para compararlas con otras variantes de hacerlo.
Si un valor puede aparecer más de una vez en su conjunto y la "frecuencia" es importante para usted, también puede usar un número creciente en lugar del booleano que utilicé para mi ejemplo.
Un comentario a las soluciones hash antes mencionadas. En realidad, {} crea un objeto (también mencionado anteriormente) que puede provocar algunos efectos secundarios. Una de ellas es que su "hash" ya está rellenado previamente con los métodos de objetos predeterminados.
Entonces, "toString" in setOfValues
será true
(al menos en Firefox). Puede anteponer otro carácter, por ejemplo, "." a sus cadenas para evitar este problema o usar el objeto Hash proporcionado por la biblioteca "prototipo".
Una forma posible, particularmente eficiente si el conjunto es inmutable, pero aún se puede utilizar con un conjunto de variables:
var haystack = "monday tuesday wednesday thursday friday saturday sunday";
var needle = "Friday";
if (haystack.indexOf(needle.toLowerCase()) >= 0) alert("Found!");
Por supuesto, puede necesitar cambiar el separador dependiendo de las cadenas que tiene que poner allí ...
Una variante más robusta puede incluir límites para asegurar que ni "día de bodas" ni "día" pueden coincidir positivamente:
var haystack = "!monday!tuesday!wednesday!thursday!friday!saturday!sunday!";
var needle = "Friday";
if (haystack.indexOf(''!'' + needle.toLowerCase() + ''!'') >= 0) alert("Found!");
Puede que no sea necesario si la entrada es segura (por ejemplo, fuera de la base de datos, etc.).
Lo usé en un script de Greasemonkey, con la ventaja de usar el pajar directamente fuera del almacenamiento de GM.
Usa una tabla hash y haz esto:
// Initialise the set
mySet = {};
// Add to the set
mySet["some string value"] = true;
...
// Test if a value is in the set:
if (testValue in mySet) {
alert(testValue + " is in the set");
} else {
alert(testValue + " is not in the set");
}
Usar una tabla hash podría ser una opción más rápida.
Independientemente de la opción que elija, vale la pena probar su rendimiento frente a las alternativas que considere.
Tropecé con esto y me di cuenta de que las respuestas están desactualizadas. En este día y edad, no debería implementar conjuntos utilizando hashtables excepto en casos de esquina. Deberías usar sets .
Por ejemplo:
> let set = new Set();
> set.add(''red'')
> set.has(''red'')
true
> set.delete(''red'')
true
> set.has(''red'')
false
Consulte esta publicación SO para obtener más ejemplos y discusión: ¿Cómo crear un conjunto en JavaScript?
Sé que es una publicación anterior. Pero para detectar si un valor está en un conjunto de valores, podemos manipular a través de la matriz indexOf()
que busca y detecta el presente del valor
var myString="this is my large string set";
var myStr=myString.split('' '');
console.log(''myStr contains "my" = ''+ (myStr.indexOf(''my'')>=0));
console.log(''myStr contains "your" = ''+ (myStr.indexOf(''your'')>=0));
console.log(''integer example : [1, 2, 5, 3] contains 5 = ''+ ([1, 2, 5, 3].indexOf(5)>=0));