Функции высшего порядка, которые каким-то образом применяют функцию к элементам массива, широко распространены в JavaScript. Метод >forEach
– одна из самых примитивных подобных функций. В качестве методов массивов нам доступно много других вариантов функций. Для знакомства с ними давайте поиграем с ещё одним набором данных.
Несколько лет назад кто-то обследовал много архивов и сделал целую книгу по истории моей фамилии. Я открыл её, надеясь найти там рыцарей, пиратов и алхимиков… Но оказалось, что она заполнена в основном фламандскими фермерами. Для развлечения я извлёк информацию по моим непосредственным предкам и перевёл в формат, пригодный для чтения компьютером.
Файл выглядит примерно так:
>[
> {"name": "Emma de Milliano", "sex": "f",
> "born": 1876, "died": 1956,
> "father": "Petrus de Milliano",
> "mother": "Sophia van Damme"},
> {"name": "Carolus Haverbeke", "sex": "m",
> "born": 1832, "died": 1905,
> "father": "Carel Haverbeke",
> "mother": "Maria van Brussel"},
> … и так далее
>]
Этот формат называется JSON, что означает JavaScript Object Notation (разметка объектов JavaScript). Он широко используется в хранении данных и сетевых коммуникациях.
JSON похож на JavaScript по способу записи массивов и объектов – с некоторыми ограничениями. Все имена свойств должны быть заключены в двойные кавычки, а также допускаются только простые величины – никаких вызовов функций, переменных, ничего что включало бы вычисления. Также не допускаются комментарии.
JavaScript предоставляет функции >JSON.stringify
и >JSON.parse
, которые преобразовывают данные из этого формата и в этот формат. Первая принимает значение и возвращает строчку с JSON. Вторая принимает такую строчку и возвращает значение.
>var string = JSON.stringify({name: "X", born: 1980});
>console.log(string);
>// → {"name":"X","born":1980}
>console.log(JSON.parse(string).born);
>// → 1980
Переменная >ANCESTRY_FILE
, доступная здесь, содержит JSON файл в виде строки. Давайте её раскодируем и посчитаем количество упомянутых людей.
>var ancestry = JSON.parse(ANCESTRY_FILE);
>console.log(ancestry.length);
>// → 39