过滤AppleScript中的记录

时间:2018-11-15 12:00:51

标签: applescript record

尝试根据属性值获取某些记录:

set x to {{a:1, b:2, c:"yes"}, {a:2, b:2, c:""}, {a:3, b:2, c:"no"}}
get every item of x whose (c ≠ "")

给予

error "The variable c is not defined." number -2753 from "c"

我在做什么错了?

此循环有效:

set y to {}
repeat with i in x
    if i's c ≠ "" then
        set end of y to i
    end if
end repeat
get y

...给出:

{item 1 of {{a:1, b:2, c:"yes"}, {a:2, b:2, c:""}, {a:3, b:2, c:"no"}}, item 3 of {{a:1, b:2, c:"yes"}, {a:2, b:2, c:""}, {a:3, b:2, c:"no"}}}

...但是似乎有点过分,而且似乎是指向原始记录的指针?

1 个答案:

答案 0 :(得分:1)

AppleScript记录无法按照您希望的方式进行过滤,因此,使用普通的AppleScript,您在使用重复循环的方法中完全正确,并且观察到它正在返回对值而不是值本身。

要取消引用这些,请将最后一行更改为

get y's contents

get the contents of y 

如果您不介意向脚本中注入一些Objective-C,我们可以创建一个 script对象,该对象定义filterItems处理程序的实现,可用于过滤通过谓词字符串列出,实际上,它使您对事物的方式以及事物的过滤方式有更多的了解:

script array
    use framework "Foundation"

    property this : a reference to current application
    property NSArray : a reference to NSArray of this
    property NSPredicate : a reference to NSPredicate of this


    to filterItems for x as string given list:L
        local L, x

        NSPredicate's predicateWithFormat:x
        (NSArray's arrayWithArray:L)'s ¬
            filteredArrayUsingPredicate:result
        result as anything
    end filterItems
end script

您可以在脚本的底部弹出此按钮,以使其不受干扰,然后使用它来过滤记录列表,如下所示:

set x to {{a:1, b:2, c:"yes"}, {a:2, b:2, c:""}, {a:3, b:2, c:"no"}}

filterItems of array for "c!=''" given list:x
    --> {{a:1, b:2, c:"yes"}, {a:3, b:2, c:"no"}}

但是,请注意,Objective-C和AppleScript执行比较的方式有所不同。例如,如果我们将x声明为:

set x to {{a:1, b:2}, {a:2, b:2, c:""}, {a:3, b:2, c:"no"}}

任何假设以c为基础的假想AppleScript过滤器都不是空字符串,一旦遇到不包含该对象的对象(x的项目1:{a:1, b:2}),都会引发错误属性c。 Objective-C的评估更具包容性:

filterItems of array for "c!=''" given list:x
    --> {{a:1, b:2}, {a:3, b:2, c:"no"}}

如果您对此结果中包含{a:1, b:2}感到惊讶,则需要基于两个条件来确定过滤条件,即返回的对象包含名为c的属性,并且此属性不是一个空字符串:

filterItems of array for "SELF CONTAINS c && c!=''" given list:x
    --> {a:3, b:2, c:"no"}

请注意,由于结果是单个对象,因此与AppleScript不同,Objective-C无需返回单项list并返回对象本身即{{1 }}。

有关谓词字符串及其用法的更多信息,请参见At A Glance部分以快速了解常规语法,以及Basic Comparisons到该页面末尾针对不同运算符的所有内容可以用于不同类型的值。

但是,如果您需要一些其他帮助来构成谓词字符串以适应特定情况,请发表评论,我会尽力帮助您。