Gibt es in AppleScript eine Möglichkeit, "X of every" zu verwenden, um mehrere Eigenschaften jedes Objekts zum Erstellen eines Datensatzes zu erhalten?

Mit dem Skript ist es möglich:

tell application "Safari"
    set urls to URL of every tab of every window
end tell

Beim Ausführen alle URLs von jedem Tab jedes Fensters abrufen (zweidimensionale Liste)

Result:
 {{"http://domain1", "http://domain2", ...}, {"http://domain3", "http://domain4", ...}, {...}}

Aber ist es möglich mit:

tell application "Safari"
    set (urls & name) to URL of every tab of every window
end tell

um einen Datensatz anstelle einer Liste zu erhalten:

Result:
 {{{url: "http://domain1", name: "domain1 - foo"}, {url: "http://domain2", name: "domain2 - bar2"}, {...}}, {{url: "http://domain3", name: "domain3 - foo3"}, {url: "http://domain4", name: "domain4 - bar4"}, {...}}}

Ist es möglich oder sollte ich nur verwenden repeat?

Antworten (1)

Es ist nicht möglich, einen Datensatz mit einem einzelnen Objektbezeichner zu erhalten, aber Sie können eine Liste erhalten:

tell application "Safari"
    {URL, name} of tabs of windows
end tell
-- {{{"http://url1", "title 1"}, {"http://url2", "title 2"}}}

Für eine Aufzeichnung können Sie eine Wiederholungsschleife verwenden:

set r to {}
tell application "Safari"
    repeat with t in tabs of windows
        set end of r to {|url|:URL of t, |name|:name of t}
    end repeat
end tell
r
-- {{|url|:"http://url1", |name|:"title 1"}, {|url|:"http://url2", |name|:"title 2"}}
Großartig! kann man das alles mit bekommen {|safari|: {{|window_1|: {|url|: "http://url1", |name|: "title 1"}, {|url|:"http://url2", |name|:"title 2"}},{|window_2|: {|url|: "http://url3", |name|: "title 3"}, {|url|:"http://url4", |name|:"title 4"}}}}? Damit ich den Datensatz in json konvertieren könnte (z. B. mit JSON Helper) und trotzdem eine Safari-Windows-Struktur habe? Ich habe ein Skript für all das geschrieben, um ein String-basiertes (nicht Datensatz-/Listen-basiertes, was ich gerne hätte) zu bekommen, und es sind ungefähr 200 Codezeilen mit 3 Unterroutinen und es sieht selbst für mich hässlich aus
Wenn ich das so teste: {|safari|: {|window1|: {{|url1|: "http1", |name1|: "title1"},{|url2|: "http2", |name2|: "title2"},{|url3|: "http3", |name3|: "title3"}}}} & {|safari|: {|window2|: {{|url1|: "http1", |name1|: "title1"},{|url2|: "http2", |name2|: "title2"},{|url3|: "http3", |name3|: "title3"}}}}es kommt nur: zurück {safari:{window1:{{url1:"http1", name1:"title1"}, {url2:"http2", name2:"title2"}, {url3:"http3", name3:"title3"}}}}und nicht die gemergte Variante, wo es eine Liste von gibtwindows
Die doppelten geschweiften Klammern (z. B. Liste): {|safari|: -->{{<-- |window1|: ...ändert nichts
Entschuldigung für so viele Off-Topic-Kommentare, aber ich habe es fast für mich selbst gelöst: Wie setze ich den Schlüssel des Rekords in der Laufzeit? also set end of w_l to {|window & "_" & window_i :t_l}?