如何制作数组数组并使用 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"
,这是任意生成的记录的名称。
我想创建一个数组数组,像这样,
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"
,这是任意生成的记录的名称。