【问题标题】:Comparisons / Rich queries in Javascript for Automation (JXA) "whose()"Javascript for Automation (JXA) “whose()”中的比较/丰富查询
【发布时间】:2016-10-27 16:22:19
【问题描述】:

如果我想查看我的 OS X 日历(以前称为“iCal”)以查找摘要为“午餐”的事件,我可以执行以下操作:

var eventsContainer = Application('Calendar').calendars[0].events
for (var i = 0; i < eventsContainer.length; i++) {
    var thisEvent = eventsContainer[i];
    if (thisEvent.summary() == 'Lunch') { doSomething() }
} 

即使考虑到仅搜索第一个日历这一事实,它也非常、非常、非常慢,因为每个 iCal 事件都需要转换为 Javascript 对象才能运行。这是一个明显更快的公式:

var foundEvents = Application('Calendar').calendars.events.whose({summary: 'Lunch'});

这非常适合精确匹配 summary == 'Lunch'。但是像 endDate: &gt; new Date()summary: /lunch/i 这样的比较呢?是否可以将本机 (ObjC) 代码传递给 who() 选择器? whose() 是否有任何文档可以提供帮助?

【问题讨论】:

标签: javascript objective-c macos icalendar javascript-automation


【解决方案1】:

相关文档原来在 OS X 10.10 的应用程序间通信发行说明中:https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/OSX10-10.html

whose() 参数中对象的右侧可以采用另一个单元素对象,其中左侧给出运算符,右侧给出值。例如:

.calendars.events.whose({summary: {_beginsWith: 'Lunch'}});

或者在我的情况下,查找从今天开始的事件:

    var startOfDay = new Date();
    startOfDay.setHours(0);
    startOfDay.setMinutes(0);
    startOfDay.setSeconds(0);
    startOfDay.setMilliseconds(0);
    var endOfDay = new Date();
    endOfDay.setHours(23);
    endOfDay.setMinutes(59);
    endOfDay.setSeconds(59);
    endOfDay.setMilliseconds(999);

    var events = Application('Calendar').calendars.events.whose({
        _and: [
            { startDate: { _greaterThan: startOfDay }},
            { startDate: { _lessThan: endOfDay }}
        ]
    });
    var convertedEvents = events();
    for (var cal of convertedEvents) {
        for (var ev of cal) { 
            console.log(ev.summary());
        }
    }  

【讨论】:

  • 感谢分享精彩的问答!
  • 谢谢!我将保留“已接受的答案”以查看是否有人可以改进语法/速度。在我的电脑上查询需要 20 秒。
  • “在我的电脑上查询需要 20 秒”——这让我很吃惊。仅通过“var events = ...”来计时会很有趣陈述。我会这样做,但我不使用 Apple 日历。我对 who() 函数的一般方法和使用更感兴趣。
  • var events = ... 语句完全不需要时间,因为它相当于 SQL 准备语句。这是 var convertedEvents = events() 语句一直占用的时间,但无论检索多少事件,它都需要相同的时间(大约)。它占执行时间的 90% 以上。据推测,我日历中的事件数量是 O(n),我认为大约是 2,000(50 x 月 * 4 年)。显然 iCal 有一个更快的系统。
  • @MichaelScottCuthbert 你在哪里运行你的代码? ScriptEditor 不需要 console.log()
猜你喜欢
  • 2017-09-03
  • 2015-04-16
  • 2018-05-27
  • 2015-01-19
  • 2016-09-09
  • 2017-06-28
  • 2017-06-28
  • 2016-04-02
  • 1970-01-01
相关资源
最近更新 更多