Выразительный JavaScript (Хавербеке) - страница 50

, в метод >apply. Первый аргумент метода >apply, которому мы в данном случае присваиваем >null, можно использовать для эмуляции вызова метода. Мы вернёмся к этому вопросу в следующей главе.

JSON

Функции высшего порядка, которые каким-то образом применяют функцию к элементам массива, широко распространены в 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

Фильтруем массив

Чтобы найти людей, которые были молоды в 1924 году, может пригодиться следующая функция. Она отфильтровывает элементы массива, которые не проходят проверку.

>function filter(array, test) {

>  var passed = [];

>  for (var i = 0; i < array.length; i++) {