6 votes

Trouver un enregistrement avec la touche Liste par dans AppleScript

Existe-t-il un moyen d'obtenir un enregistrement par la valeur d'une de ses clés sans boucle ?

J'ai fait ça :

set theKey to 22

set theRecords to {{key:11, value:"foo"}, {key:22, value:"bar"}}
repeat with theRecord in theRecords
    if key of theRecord = theKey then
      display dialog (key of theRecord as text) & ":" & value of theRecord
    end if
end repeat

4voto

Kaydell Points 289

Je suppose que vous êtes préoccupé par la vitesse d'itération. L'itération serait un temps d'ordre-n O(n).

En AppleScript, vous pouvez éventuellement utiliser un enregistrement d'enregistrements au lieu d'une liste d'enregistrements, mais je crois qu'alors la classe de la clé devrait être un identifiant - et non un nombre entier comme dans votre exemple.

Voici un lien vers une personne ayant une question similaire : Émulation de tableaux associatifs dans AppleScript

La réponse de Lauri Ranta consiste à utiliser l'outil de ligne de commande appelé "awk".

La solution que j'ai envisagée était de créer une application d'arrière-plan sans visage qui serait ce qu'on appelle un "agent" auquel les AppleScript pourraient faire appel pour utiliser leurs structures de données telles qu'un tableau associatif (également connu sous le nom de dictionnaire ou de mappage).

Je n'ai pas fait ma solution. C'est juste une idée, mais tu pourrais utiliser la réponse de Lauri, elle sait généralement de quoi elle parle.

Comme je connais un peu Pyton, et que Pyton est livré avec OS X, préinstallé dans le dossier système, j'envisagerais d'utiliser moi-même Python.

J'ai réessayé en "pur AppleScript" avec le code suivant dont je ne suis pas vraiment satisfait :

set theRecords to {fooKey:{key:"fooKey", value:"fooValue"}, barKey:{key:"barKey", value:"barValue"}}
try
    set theRecord to get barKey of theRecords
    display dialog (key of theRecord & ":" & value of theRecord)
on error errorMessage number errorNumber
    if errorNumber is not equal to -128 then
        display dialog "No match"
    end if
end try

Vous pouvez mélanger les script du shell et les AppleScripts :

-- in AppleScript, you can call a shell script
do shell script "<enter your shell script here>"

Ou bien, vous pouvez appeler un AppleScript à partir d'un shell script avec l'outil de ligne de commande appelé "osascript".

2 votes

J'ai eu exactement la même question. Ce que je ne comprends pas, c'est pourquoi AppleScript ne permet pas l'exécution de la ligne suivante : (every item in theRecords whose key is theKey) o (first item in theRecords whose key is theKey) . Cela serait très puissant et similaire aux compréhensions de listes de Python.

1voto

Mitoxys Points 101

En utilisant Foundation cadre

use AppleScript version "2.7"
use scripting additions
use framework "Foundation"

to get_item from pool for item_name
    set poolData to my (NSDictionary's dictionaryWithDictionary:pool)
    set poolDataKeys to poolData's allKeys()
    if (poolDataKeys as list) contains item_name then
        set item_value to poolData's valueForKey:item_name
        return item_value as text
    else
        return false
    end if
end get_item

set keyName to "circle"
set pool to {box:"BOX A", circle:"CIRCLE B"}
set value to get_item from pool for keyName

tell application "System Events"
    set keyName to "circle"
    set pool to {box:"BOX A", circle:"CIRCLE B"}
    set value to get_item of me from pool for keyName
end tell

de 1

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X