AppleScript JXA 过滤 Table 具有相同名称但不同项目的许多行

AppleScript JXA Filtering Table With Many Rows with Same Name But Different Items

我有一个巨大的 table,其中有许多行名称相同但每行中的项目不同。如果我执行以下
行数 = table.rows.whose(searchFilter)()
然后,如果我检查 rows.length,我会得到正确的搜索号码。但是,数组只有第一行重复多次。我猜这是因为所有行都具有相同的名称,并且其 returns 对象说明符基于 byName()。我可以通过使用 JavaScript 遍历每一行来进行过滤,但这确实需要很长时间。谁似乎更快地过滤正确的,但 returns 错误的行。有解决办法吗?
谢谢!

你没有说你正在编写什么应用程序的脚本(这会有所帮助),但听起来这不是一个 JXA 问题(一次)而是一个应用程序问题,因为它是目标应用程序决定是否 return 按索引、按名称或按 ID 说明符。只有 by-id 说明符可以保证既稳定又唯一(它们唯一的缺点是与其他形式不同,ID 值不是人类可读的),但是很多应用 return by-index 或 by-名称形式;如果元素四处移动,前者是一个问题,如果元素名称不是唯一的,则后者是一个问题。

我认为您唯一可行的选择是让行值匹配,然后在一组行值符合您的要求时自行枚举以构建您自己的按索引说明符。这样一来,您仍然总共只发送几个 Apple 事件(即一个 AE 从单个列中检索所有值),而不是每个 发送多个事件。处理 AE 是一项昂贵的操作,因此如果您可以使用更少、更复杂的查询来检索相同的数据,那么这将比使用大量简单的查询便宜得多,即使您仍然自己整理数据以获得它变成你真正想要的形式。

例如在 AppleScript [1] 中,您可以这样写:

tell app "Whatever"
    set allFoos to get value of cell "foo" of every row of theTable
    set allBars to get value of cell "bar" of every row of theTable
    set foundRefs to {}
    repeat with i from 1 to length of allNames
        if item i of allFoos is myFoo and item i of allBars is myBar then
            set end of foundRefs to row i of theTable
        end if
    end repeat
end tell
-- foundRefs list now contains by-index refs to the matched rows

Here's another example 如果它有助于说明这一点。)

弄清楚如何在 JXA 中编写等效代码留给任何愚蠢到首先使用那个破屁股 POS 的人。 [2]

--

[1] 具有讽刺意味的是,由于糟糕的内部实现,AppleScript 列表具有 O(n) 查找性能(就像 JS 的 Array 类型,AS 列表实际上是向量数组,所以应该是 O(1),但是让它们实际以这种方式运行需要在额外的 AS 代码中添加以欺骗运行时绕过糟糕的位)。所以显示的 AppleScript 代码会异常糟糕地执行,但它的目的只是为了演示通用算法,而不是作为生产脚本,所以我不会用乱七八糟的废话来混淆它 [2].

[2] 我在 AS 和 JXA 的房子上都打了痘,并坚持自己使用 appscript,这是有原因的。责怪 Apple 将他们最伟大、最具用户授权的创新之一(最终用户桌面自动化)直接付诸东流,甚至没有意识到他们已经做到了。