PDA

Ver la Versión Completa : [ IDEA ] Comprobar si un array contiene un elemento concreto.


Rsc
30/11/17, 19:59:52
Echando un vistazo en el foro oficial de Tasker, he encontrado una forma, que hasta ahora no conocía, de comprobar si un array contiene un elemento concreto, y es así;

%array(#?%elemento)

Devolverá el indice del elemento, o devolverá 0, si no se encuentra en el array.

Ej:

%array()=uno,dos,tres,cuatro,cinco.

%elemento=tres

Acción Flash: %array(#?%elemento) devolverá 3

...

Hasta ahora, yo hacía esta comprobación de la siguiente forma;

IF %array() coincide *%elemento*

Pero creo que sobretodo con arrays con muchos elementos, la primera opción debe ser más efectiva.

WillyWeb
30/11/17, 20:07:07
... si te parece bien, lo podrías añadir a: Tasker para principiantes. Lección 7. Las matrices de variables. ...

Pero si eso ya está en el tutorial... :oh:

%matriz(#?b/c)
Una lista separada por comas de los índices de matriz (de menor a mayor) con valores coincidentes con los indicados, o 0 si no coincide ninguno (2,3 en el ejemplo).

Rsc
30/11/17, 20:16:34
Que desastre, mira que he repasado veces ese tutorial, y nunca me fijé en esa intorrogación... Y yo compartiéndolo como si hubiera descubierto América... Bueno si os vale la intención era buena :risitas:

Se ve que en su día encontré la opción de IF %array() coincide *%elemento*, y pensé que era la única.

Voy a eliminar por lo menos, la sugerencia de incluirlo en el tutorial.

WillyWeb
30/11/17, 20:36:18
Que desastre, mira que he repasado veces ese tutorial, y nunca me fijé en esa intorrogación... Bueno si os vale la intención era buena.

:risitas:

No pasa nada. Efectivamente, la intención era buena. Y seguro que Caravantes no te lo tiene en cuenta. :sisi1:

Caravantes
01/12/17, 12:37:43
la intención era buena. Y seguro que Caravantes no te lo tiene en cuenta

Estaba leyendo el primer post del hilo y estaba pensando:
- "Es un truco buenísimo esto que ha descubierto RSC, no me voy a limitar a pulsar el botón de "Gracias", voy a escribir un breve mensaje para agradecer de forma explícita".

Resumiendo, que yo tampoco me lo sabía a pesar de haber leído el tutorial en su momento. Lo mío es peor porque creo recordar que fui yo quien lo tradujo del inglés, pero ni con esas. Supongo que si en aquel momento no lo necesitaba o no me pareció importante, y no lo fijé adecuadamente en la memoria.

%matriz(#?b/c)
Una lista separada por comas de los índices de matriz (de menor a mayor) con valores coincidentes con los indicados, o 0 si no coincide ninguno (2,3 en el ejemplo).

Es que -además- está mal explicado de narices [colleja a partes iguales para el redactor original y para quien hizo una traducción literal :silbando: ], no me extraña que solo lo hayáis asimilado la mitad de los más listos (estoy mirando a Willy y a RSC).

Sinceramente, creo que sería buena idea que en esa página del tutorial RSC añadiese un abajo un comentario-respuesta explicándolo bien, tal como ha hecho aquí. Luego yo pongo en ese párrafo del tutorial una nota-enlace a la explicación/comentario.

WillyWeb
01/12/17, 12:41:05
Voy a eliminar por lo menos, la sugerencia de incluirlo en el tutorial.

:risitas::risitas::risitas:

Ves como Caravantes no te lo tendría en cuenta. Si hasta te ha puesto una medalla. :campeon:

Rsc
04/12/17, 15:11:40
no me extraña que solo lo hayáis asimilado la mitad de los más listos (estoy mirando a Willy y a RSC).

A mi no me mires, ya te digo que he repasado ese hilo 200 veces y no me había percatado. Creo que en este foro, nunca o casi nunca se ha utilizado esa forma de averiguar si un elemento está incluido o no en un array, y que casi todos lo hacíamos como he comentado antes. IF % carray() ~ *%elemento*

Sinceramente, creo que sería buena idea que en esa página del tutorial RSC añadiese un abajo un comentario-respuesta explicándolo bien, tal como ha hecho aquí

Siento no haberlo hecho antes, hay rachas que me cuesta sacar tiempo para mis hobbys... No se si aún quieres que lo indique también en el otro hilo, o prefieres dejarlo simplemente con el enlace a este hilo, que he visto que has añadido.

Bueno y a lo que iba...

Como vengo haciendo últimamente, cuando hay más de una forma de hacer lo mismo, he calculado el tiempo que tarda en ejecutarse de ambas formas, y me he llevado una sorpresa...

TAREA 1

A1: Establecer variable [ Nombre:%timetarea A:%TIMEMS Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A2: Si (if) [ %Habilitados() ~ *rebeca* ]
A3: Esperar [ MS:1 Segundos:0 Minutos:0 Horas:0 Días:0 ]
A4: Fin si (End if)
A5: Establecer variable [ Nombre:%timetareaduracion A:%TIMEMS - %timetarea Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
A6: Flash [ Texto:%timetareaduracion Largo:Apagado ] (Tarda entre 9 y 15 ms)

TAREA 2

A1: Establecer variable [ Nombre:%timetarea A:%TIMEMS Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A: Si (if) [ %Habilitados(#?rebeca) != 0 ]
A3: Esperar [ MS:1 Segundos:0 Minutos:0 Horas:0 Días:0 ]
A4: Fin si (End if)
A5: Establecer variable [ Nombre:%timetareaduracion A:%TIMEMS - %timetarea Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
A6: Flash [ Texto:%timetareaduracion Largo:Apagado ] (Tarda entre 40 y 60 ms)

Daba por hecho que la segunda opción, nueva para mi, iba a ser mas eficaz, pero acabo de comprobar que no...

danko9696
04/12/17, 15:39:28
Daba por hecho que la segunda opción, nueva para mi, iba a ser mas eficaz, pero acabo de comprobar que no...
Hacen cosas distintas. En el primer caso no te devuelve ninguna posición, lo estás tratando como una cadena de texto (contiene Rebeca sí o no). Mientras que en segundo le estás pidiendo que te devuelva la posición dentro del array, si se encuentra en él.

No sé como irá en rendimiento pero yo alguna vez he usado el indexOf en JS para seleccionar un índice concreto manejando escenas, ya que es la forma de seleccionar en algunos elementos que usan arrays.

Rsc
04/12/17, 17:42:03
Tienes razón, aunque con ambas puedes comprobar si un array contiene un elemento concreto, no hacen exactamente lo mismo.

Pero me imaginaba, que al tener que recorrer todo el array para comprobar si el *%elemento* coincide,tardaría más en ejecutarse...

indexOf en JS para seleccionar un índice concreto manejando escenas

Con esto te refieres a que sitúas/enfocas el indice que deseas de un array, en un elemento menú?

danko9696
04/12/17, 21:29:23
Pero me imaginaba, que al tener que recorrer todo el array para comprobar si el *%elemento* coincide,tardaría más en ejecutarse...
No si lo comparas como una cadena en lugar de como un array, solo hay una comparación (y me da que eso es lo que hace). Mientras que en el segundo caso puede haber también solo una (si resulta ser el primero) pero normalmente serán más. De hecho, si yo tuviese que hacer lo mismo en JS habría hecho exactamente eso, comparar con la cadena antes de convertirla en array (y quizás no realizar esa conversión). Creo que Tasker hace lo mismo internamente.

Con esto te refieres a que sitúas/enfocas el indice que deseas de un array, en un elemento menú?
Nope, en un spinner.