Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ JavaScriptΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 17

Автор ΠœΠ°Ρ€Π΅ΠΉΠ½ Π₯Π°Π²Π΅Ρ€Π±Π΅ΠΊΠ΅

  };

}

Если f ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ΠΎΠ½Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ. МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΡƒΡ‡Ρƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (arg1, arg2 ΠΈ Ρ‚. Π΄.) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ всС ΠΈΡ… Π² f, Π½ΠΎ вСдь нСизвСстно, ΠΊΠ°ΠΊΠΎΠ³ΠΎ количСства Π½Π°ΠΌ Ρ…Π²Π°Ρ‚ΠΈΡ‚. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, функция f Π½Π΅ ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с arguments.length. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ всё врСмя ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈ Π±Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ΅ число Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π±Ρ‹Π»ΠΎ Π±Ρ‹ нСизвСстно, сколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π½Π°ΠΌ Π±Ρ‹Π»ΠΎ Π·Π°Π΄Π°Π½ΠΎ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ.


Для Ρ‚Π°ΠΊΠΈΡ… случаСв Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² JavaScript Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ apply. Π•ΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ массив (ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π² Π²ΠΈΠ΄Π΅ массива) ΠΈΠ· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Π° ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с этими Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ.

function transparentWrapping(f) {

  return function() {

    return f.apply(null, arguments);

  };

}

Данная функция бСсполСзна, Π½ΠΎ ΠΎΠ½Π° дСмонстрируСт ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‰ΠΈΠΉ нас шаблон – возвращаСмая Сю функция ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ Π² f всС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Сю Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, Π½ΠΎ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ. ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ это ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΅Ρ‘ собствСнных Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², хранящихся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ arguments, Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ 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++) {

    if (test(array[i]))

      passed.push(array[i]);

  }

  return passed;

}


console.log(filter(ancestry, function(person) {

  return person.born > 1900 && person.born < 1925;

}));

// β†’ [{name: "Philibert Haverbeke", …}, …]

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ с ΠΈΠΌΠ΅Π½Π΅ΠΌ test – это функция, которая ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ вычислСния ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Она вызываСтся для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта, Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Сю Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ опрСдСляСт, ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ этот элСмСнт Π² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ массив.

Π’ Ρ„Π°ΠΉΠ»Π΅ оказалось Ρ‚Ρ€ΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΌΠΎΠ»ΠΎΠ΄Ρ‹ Π² 1924 – Π΄Π΅Π΄ΡƒΡˆΠΊΠ°, Π±Π°Π±ΡƒΡˆΠΊΠ° ΠΈ Π΄Π²ΠΎΡŽΡ€ΠΎΠ΄Π½Π°Ρ Π±Π°Π±ΡƒΡˆΠΊΠ°.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, функция filter Π½Π΅ удаляСт элСмСнты ΠΈΠ· ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ массива, Π° строит Π½ΠΎΠ²Ρ‹ΠΉ, содСрТащий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ элСмСнты. Π­Ρ‚ΠΎ чистая функция, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½Π΅ ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΉ Π΅ΠΉ массив.

Как ΠΈ forEach, filter – это ΠΎΠ΄ΠΈΠ½ ΠΈΠ· стандартных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² массива. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ описали Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΄Π΅Π»Π°Π΅Ρ‚ Π²Π½ΡƒΡ‚Ρ€ΠΈ. ΠžΡ‚Π½Ρ‹Π½Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ просто:

console.log(ancestry.filter(function(person) {

  return person.father == "Carel Haverbeke";

}));

// β†’ [{name: "Carolus Haverbeke", …}]

ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ map

Допустим, Π΅ΡΡ‚ΡŒ Ρƒ нас массив ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… людСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠ΅ΠΉ массива ΠΏΡ€Π΅Π΄ΠΊΠΎΠ². Но Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ массив ΠΈΠΌΡ‘Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΡ€ΠΎΡ‡Π΅ΡΡ‚ΡŒ.

ΠœΠ΅Ρ‚ΠΎΠ΄ map ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ массив, примСняя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠΎ всСм Π΅Π³ΠΎ элСмСнтам ΠΈ строя Π½ΠΎΠ²Ρ‹ΠΉ массив ΠΈΠ· Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π£ Π½ΠΎΠ²ΠΎΠ³ΠΎ массива Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π° ΠΆΠ΅ Π΄Π»ΠΈΠ½Π°, Ρ‡Ρ‚ΠΎ Ρƒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Π½ΠΎ Π΅Π³ΠΎ содСрТимоС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΎ Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.

function map(array, transform) {

  var mapped = [];

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

    mapped.push(transform(array[i]));

  return mapped;

}


var overNinety = ancestry.filter(function(person) {

  return person.died - person.born > 90;

});

console.log(map(overNinety, function(person) {

  return person.name;

}));

// β†’ ["Clara Aernoudts", "Emile Haverbeke",

//    "Maria Haverbeke"]

Π§Ρ‚ΠΎ интСрСсно, люди, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠΆΠΈΠ»ΠΈ хотя Π±Ρ‹ Π΄ΠΎ 90 Π»Π΅Ρ‚ – это Ρ‚Π΅ самыС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ Ρ€Π°Π½Π΅Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ ΠΌΠΎΠ»ΠΎΠ΄Ρ‹ Π² 1920-Ρ… Π³ΠΎΠ΄Π°Ρ…. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π· самоС Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ Π² ΠΌΠΎΠΈΡ… записях. Π’ΠΈΠ΄ΠΈΠΌΠΎ, ΠΌΠ΅Π΄ΠΈΡ†ΠΈΠ½Π° ΡΠ΅Ρ€ΡŒΡ‘Π·Π½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»Π°ΡΡŒ.

Как ΠΈ forEach ΠΈ filter, map Ρ‚Π°ΠΊΠΆΠ΅ являСтся стандартным ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Ρƒ массивов.

Π‘ΡƒΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ reduce

Π”Ρ€ΡƒΠ³ΠΎΠΉ популярный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с массивами – ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ значСния Π½Π° основС Π΄Π°Π½Π½Ρ‹Ρ… Π² массивС. Один ΠΏΡ€ΠΈΠΌΠ΅Ρ€ – ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠ΅ Π½Π°ΠΌ суммированиС списка Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ². Π”Ρ€ΡƒΠ³ΠΎΠΉ – поиск Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, Ρ€ΠΎΠ΄ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ Ρ€Π°Π½ΡŒΡˆΠ΅ всСх.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° называСтся reduce (ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅; ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° fold, свёртываниС). МоТно ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‘ Π² Π²ΠΈΠ΄Π΅ складывания массива, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ элСмСнту Π·Π° Ρ€Π°Π·. ΠŸΡ€ΠΈ суммировании чисСл ΠΌΡ‹ Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΈ с нуля, ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Π΅Π³ΠΎ с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ суммой ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ слоТСния.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ reduce, ΠΊΡ€ΠΎΠΌΠ΅ массива – ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ функция ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π­Ρ‚Π° функция Ρ‡ΡƒΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΅ понятная, Ρ‡Π΅ΠΌ filter ΠΈΠ»ΠΈ map, поэтому ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° Π½Π΅Ρ‘ ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.

function reduce(array, combine, start) {

  var current = start;

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

    current = combine(current, array[i]);

  return current;

}


console.log(reduce([1, 2, 3, 4], function(a, b) {

  return a + b;

}, 0));

// β†’ 10

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ массивов reduce, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚Π°ΠΊ ΠΆΠ΅, Π΅Ρ‰Ρ‘ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π΅Π½. Если массив содСрТит хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ элСмСнт, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ start. ΠœΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·ΡŒΠΌΡ‘Ρ‚ Π² качСствС стартового значСния ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива ΠΈ Π½Π°Ρ‡Π½Ρ‘Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ со Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ reduce Π½Π°ΠΉΡ‚ΠΈ самого Π΄Ρ€Π΅Π²Π½Π΅Π³ΠΎ ΠΈΠ· извСстных ΠΌΠΎΠΈΡ… ΠΏΡ€Π΅Π΄ΠΊΠΎΠ², ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅Ρ‡Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅:

console.log(ancestry.reduce(function(min, cur) {

  if (cur.born < min.born) return cur;

  else return min;

}));

// β†’ {name: "Pauwels van Haverbeke", born: 1535, …}

ΠšΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ

Как Π±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (поиск Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° с самой Ρ€Π°Π½Π½Π΅ΠΉ Π΄Π°Ρ‚ΠΎΠΉ роТдСния) Π±Π΅Π· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка? На самом Π΄Π΅Π»Π΅, ΠΊΠΎΠ΄ Π½Π΅ Ρ‚Π°ΠΊΠΎΠΉ ΡƒΠΆ ΠΈ уТасный:

var min = ancestry[0];

for (var i = 1; i < ancestry.length; i++) {

  var cur = ancestry[i];

  if (cur.born < min.born)

    min = cur;

}

console.log(min);

// β†’ {name: "Pauwels van Haverbeke", born: 1535, …}

Π§ΡƒΡ‚ΡŒ большС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π° Π΄Π²Π΅ строчки Π΄Π»ΠΈΠ½Π½Π΅Π΅ – Π½ΠΎ ΠΏΠΎΠΊΠ° достаточно понятный ΠΊΠΎΠ΄.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹ΡΡˆΠ΅Π³ΠΎ порядка Ρ€Π°ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ свои возмоТности ΠΏΠΎ-настоящСму, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΌ приходится ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, напишСм ΠΊΠΎΠ΄, находящий срСдний возраст ΠΌΡƒΠΆΡ‡ΠΈΠ½ ΠΈ ΠΆΠ΅Π½Ρ‰ΠΈΠ½ Π² Π½Π°Π±ΠΎΡ€Π΅.

function average(array) {

  function plus(a, b) { return a + b; }

  return array.reduce(plus) / array.length;

}

function age(p) { return p.died - p.born; }

function male(p) { return p.sex == "m"; }

function female(p) { return p.sex == "f"; }


console.log(average(ancestry.filter(male).map(age)));