Как мне получить (людей, чей идентификатор адресов содержит addressId) в JXA?

Я использую JavaScript с osascript в MacOS Mojave 10.14.3, чтобы написать скрипт, который отображает людей и их контактную информацию из контактов. Я добавляю функцию, чтобы показать всех людей в определенном городе. Вот упрощенная версия, которая работает в редакторе скриптов:

contacts = Application('Contacts').people;
matchingAddresses = contacts.addresses.whose({city: "San Diego"});

var addressIds = [];
for (var matchedAddress of matchingAddresses()) {
    if (matchedAddress.length > 0) {
        addressIds.push(matchedAddress[0].id());
    }
}

//loop contacts and get those with a matching address
var personIds = [];
for (var possiblePerson of contacts()) {
    for (var addressToCheck of possiblePerson.addresses()) {
        if (addressIds.includes(addressToCheck.id())) {
            var personId = possiblePerson.id();
            if (!personIds.includes(personId)) {
                personIds.push(personId);
            }
        }
    }
}

personIds.length;

У меня есть тестовая версия AppleScript, которая немного более эффективна. Вместо того, чтобы перебирать все контакты, он перебирает совпадающие адреса и получает people whose id of addresses contains addressId:

tell application "Contacts"
    set matchingAddresses to (every address where its city is "San Diego") of every person

    set personIds to {}
    repeat with matchedAddressList in matchingAddresses
        repeat with possibleAddress in items of contents of matchedAddressList
            set addressId to id of possibleAddress
            set matchingPerson to first item of (people whose id of addresses contains addressId)
            if not (personIds contains id of matchingPerson) then
                set end of personIds to id of matchingPerson
            end if
        end repeat
    end repeat

    count of personIds
end tell

AppleScript (people whose id of addresses contains addressId) всегда возвращает одного человека, потому что идентификаторы адресов уникальны, и поэтому список адресов только одного человека может содержать любой конкретный идентификатор адреса.

Если бы в JavaScript или AppleScript были лучшие способы получать людей из Контактов по городу одного из их адресов, я был бы заинтересован в этом.

Но мой вопрос: есть ли способ дублировать функциональность first item of (people whose id of addresses contains addressId) с помощью JavaScript, чтобы получить одного человека, у которого есть адрес, соответствующий этому идентификатору адреса?


person Jerry Stratton    schedule 20.03.2019    source источник


Ответы (1)


Может быть, что-то более похожее…

const contacts = Application('Contacts').people,
    matchingAddresses = contacts.addresses.whose({city: "San Diego"}),
    addressIds = matchingAddresses().filter(a=>a.length).map(a=>a[0].id());

addressIds[0]; // the first id

Или, если вам нужен адрес…

const contacts = Application('Contacts').people,
    address = contacts.addresses.whose({city: "San Diego"})().filter(a=>a.length)[0]

address
person JakeCigar    schedule 20.03.2019
comment
Спасибо; то, что я действительно ищу, — это человек, у которого есть этот адрес (в конечном счете, все люди в этом городе). Правильно ли я понимаю, что ваш код переписывает раздел моего примера, который собирает адреса, но в меньшем количестве строк? Имеет ли значение использование запятой в качестве разделителя конца строки, а не точки с запятой? Отступы наводят меня на мысль, что они есть, но если я заменю запятые точками с запятой, разницы в функциях кода или времени выполнения не будет. - person Jerry Stratton; 20.03.2019
comment
Запятая продолжает объявление const. Я объявил 3 константы. Константа похожа на переменную, но однажды назначенная, она никогда не может быть изменена. Это не разделитель строк. Замена запятых точкой с запятой превращает 2-й и 3-й в необъявленные переменные. Это не хорошо. Но это все еще работает. Программисты JXA намного слабее относятся к декларациям. У меня многолетний опыт работы с javaScript, я предпочитаю объявлять var или const. - person JakeCigar; 22.03.2019