我究竟做错了什么?
简短的回答:这不是你的错。JXA 文档是一袋谎言。
更长的解释:对象的元素与数组无关。它们表示对象图中的一对多关系,在这种情况下,是一个source
对象与零个或多个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,不管表面如何:这只是语法糖,使它的查询易于阅读和编写。
...
在这种情况下,您的第二行是告诉 iTunes 获取一个查询对象 (ObjectSpecifiers) 的列表 (Array),用于标识source
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”的第一个 对象,请使用该方法而不是; 它更简单。)source
byName
whose
--
就个人而言,我认为所有这些都有些学术性,因为 JXA 的 Apple 事件桥实现,就像它的文档一样,主要是由 Lame 和 Fail 组成的。它主要在一定程度上起作用,然后在你身上大便。如果您的需求是适度的,并且它“足够好”可以为您提供更多功能,但对于任何不平凡的 AppleScript 坚持:它是唯一有效的受支持解决方案。
(AppleScript/JXA 团队也没有为这种垃圾工作找借口:几个月前我给他们发了一个几乎完成的 JavaScriptOSA 参考实现,让他们按照他们的意愿学习或窃取,他们完全忽略了。所以你会原谅我的小便,因为这是很久以前解决的问题。)