私は何を間違っていますか?
簡単な答え: それはあなたのせいではありません。JXA のドキュメントは嘘の袋です。
より長い説明: オブジェクトの要素は配列とは何の関係もありません。これらは、オブジェクト グラフ内の 1 対多の関係を表します。この場合は、source
オブジェクトと 0 個以上のlibrary
オブジェクトの間です。
多くの関係は、基礎となる実装の包含階層を反映している可能性がありますが、そうする義務はありません。たとえば、Finder を使用すると、デスクトップ上のオブジェクトを複数の方法で識別できます。
items of folder "Desktop" of folder "jsmith" of folder "Users" of disk "Macintosh HD" of app "Finder"
items of folder "Desktop" of folder "jsmith" of folder "Users" of startup disk of app "Finder"
items of folder "Desktop" of home of app "Finder"
items of folder "Macintosh HD:Users:jsmith:Desktop" of app "Finder"
items of desktop of app "Finder"
items of app "Finder"
[etc.]
Apple イベント ベースのアプリケーション スクリプトは、リモート プロシージャ コールと単純なファースト クラス クエリに基づいています。表面的な外観に関係なく、OOP ではありません。これは、クエリを読みやすく、書きやすくするための構文糖衣にすぎません。
...
source
この場合、2 行目は、iTunes アプリケーション内の各オブジェクトを識別するクエリ オブジェクト (ObjectSpecifiers) のリスト (配列) を取得するように iTunes に指示しています。
var iTunes = Application("iTunes");
var sources = iTunes.sources();
配列を取得すると、それを使用してさらにクエリを作成することはできません。これは、JavaScript 自体がクエリを作成する方法を認識していないためです。あなたが実際に欲しいのはこれです:
var iTunes = Application("iTunes");
var sourcesSpecifier = iTunes.sources;
var librarySpecifier = sourcesSpecifier.whose({name : "Library"});
source
これにより、 「Library」という名前のすべてのオブジェクトを識別するオブジェクト指定子が得られます。( 「Library」という名前の最初の オブジェクトのみを指定する場合は、 の代わりに メソッドを使用します。より簡単です。)source
byName
whose
--
個人的には、JXA の Apple イベント ブリッジの実装は、そのドキュメントと同様に、ほとんどが Lame と Fail で構成されているため、これはやや学術的であると考えています。ほとんどの場合、ある程度までは機能し、それを超えるとうんちをします。あなたのニーズがささやかなものであり、それで「十分」である場合は、より多くの機能を実行できますが、AppleScript に固執する重要な場合は、適切に機能する唯一のサポートされているソリューションです。
(AppleScript/JXA チームも、そのようながらくた作業の言い訳はできません。数か月前にほぼ完成した JavaScriptOSA 参照実装を彼らに送り、彼らが望むように勉強したり盗んだりしましたが、彼らはそれを完全に無視しました。これはずっと前に解決された問題です。)