如何制作数组数组并使用 AppleScript 提取项目?

How to make an array of arrays and extract an item using AppleScript?

我想创建一个数组数组,像这样,

set TagList to {}
repeat with i from 1 to count of AllTasks
set taskName to item i of AllTasks
[SNIP]
set TaskX to {|name|:taskName, Duedate:taskDue, |Note|:taskNote, |id|:taskId}
set TagList to TagList & TaskX
end repeat

因此结果将是一个包含多个任务的列表,每个任务显示上面的各种项目(姓名、截止日期等)。当我尝试重复时,TagList 仅以迭代中的最后一个 TaskX 结束。如果它工作正常,我想提取其 |id| 的任务的 taskName = "xzy".

有人可以指导我解决这两个问题(迭代和提取)吗?谢谢

问题出在 set TagList to TagList & TaskX 行。您试图做的(据我了解)是将 TaskX 作为新项目添加到列表 TagList 的末尾。您正在做的是连接一个列表和一条记录。结果不是您所期望的。我不确定 AppleScript 中是否定义了它。

在 AppleScript 中将项目附加到列表的最常见正确方法是:

copy TaskX to the end of TagList

set TagList to TagList & {TaskX}

第一个将一个项目附加到列表的末尾(您也可以使用 set the end of TagList to TaskX)。第二个连接两个列表,方法是将项目 taskX 放入列表,然后将其与 TagList.

连接

您追加到列表的项目是一条记录与追加过程无关。

你问题的第二部分比较难,因为技术上是不可能的。 AppleScript 的列表并不关心它们里面有什么,因此你不能只请求那些在特定字段中具有特定值的记录。

您需要做的是遍历列表以查找该字段;最有可能创建一个处理程序。它可能看起来像这样(请参阅 Apple 的文档 About Handlers):

to findTask of taskList given id:desiredId
    repeat with i from 1 to the number of items of taskList
        if the id of item i of taskList is desiredId then
            return item i of taskList
        end if
    end repeat
end findTask

本例生成21条记录的列表,名称为“Item 1”、“Item 2”、“Item 3”等,截止日期为当前日期之后的日期,依次, 其id与名称中的商品编号相同

set TagList to {}
repeat with i from 1 to 21
    set taskName to "Item " & i
    set taskDue to the (current date) + i * days
    set TaskX to {name:taskName, duedate:taskDue, id:i}
    copy TaskX to the end of TagList
    --set TagList to TagList & {TaskX}
    --set the end of TagList to TaskX
end repeat

findTask of TagList given id:3

to findTask of taskList given id:desiredId
    repeat with i from 1 to the number of items of taskList
        if id of item i of taskList is desiredId then
            return item i of taskList
        end if
    end repeat
end findTask

请求 ID 为 3 的项目的硬编码调用产生:

{name:"Item 3", duedate:date "Sunday, September 12, 2021 at 2:01:19 PM", id:3}

findTask 调用后添加 get the name of the result 生成 "Item 3",这是任意生成的记录的名称。