ΠŸΠ΅Ρ€Π΅Ρ‚ΡΠΆΠΊΠ°, ΠŸΡ€Π΅ΠΌΠΈΡ Π’ΠŸΡ€ΠΎΠ³Π΅Ρ€, 13.11
ΠŸΠ΅Ρ€Π΅Ρ‚ΡΠΆΠΊΠ°, ΠŸΡ€Π΅ΠΌΠΈΡ Π’ΠŸΡ€ΠΎΠ³Π΅Ρ€, 13.11
ΠŸΠ΅Ρ€Π΅Ρ‚ΡΠΆΠΊΠ°, ΠŸΡ€Π΅ΠΌΠΈΡ Π’ΠŸΡ€ΠΎΠ³Π΅Ρ€, 13.11

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ своё врСмя, избСгая ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ написания этих популярных JavaScript-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

МногиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…. РассказываСм, ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅ΡΡ‚Π°Ρ‚ΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ вСлосипСды.

ОблоТка: Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ своё врСмя, избСгая ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ написания этих популярных JavaScript-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

РассказываСт Π€Π»Π°Π²ΠΈΠΎ ЀрСйтас

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° β€” это интСрСсный процСсс. Но, ΡƒΠ²Π»Ρ‘ΠΊΡˆΠΈΡΡŒ, ΠΌΡ‹ Π½Π΅ всСгда Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. НапримСр, ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ (это называСтся Β«ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ вСлосипСд»). Π― Ρ…ΠΎΡ‡Ρƒ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒ вас с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ функциями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ часто ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, хотя Π΅ΡΡ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΡ‰Π΅.

НСкотороС врСмя Π½Π°Π·Π°Π΄ я Π½Π°Ρ‡Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (ΠΈΠ½ΠΎΠ³Π΄Π° ΠΎΠ΄Π½Ρƒ, ΠΈΠ½ΠΎΠ³Π΄Π° Π΄Ρ€ΡƒΠ³ΡƒΡŽ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚, Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ, ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ рСгулярно. Π­Ρ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” Underscore ΠΈ Lodash. Они эффСктивныС ΠΈ лСгковСсныС (~19 ΠšΠ‘).

Бписок, ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅, основан Π½Π° ΠΌΠΎΡ‘ΠΌ ΠΎΠΏΡ‹Ρ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. Π― описал здСсь Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ распространСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ навСрняка использовали Ρ€Π°Π½ΡŒΡˆΠ΅.

1. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ случайный элСмСнт ΠΈΠ· списка

Π­Ρ‚ΠΎ функция, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я люблю большС всСго. Π‘ Π΅Ρ‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΡ‡Π΅Π½ΡŒ просто Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… случайными значСниями, Ρ‡Ρ‚ΠΎ часто Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для тСстирования.

			const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
function getRandomItem(list){
    return list[Math.floor(Math.random() * (list.length))];
}
getRandomItem(months);
// Underscore ΠΈ Lodash
_.sample(months);
		

2. ОбъСдинСниС массивов

Π­Ρ‚ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ ваш ΠΊΠΎΠ΄ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ:

			const arrayA = [1, 2, 3, 4];
const arrayB = [3, 4, 5, 6];

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
const unionArrays = (a, b) => Array.from(new Set([...a, ...b]));

unionArrays(arrayA, arrayB); // [1, 2, 3, 4, 5, 6]

// Underscore ΠΈ Lodash
_.union(arrayA, arrayB);
		

3. ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ массивов

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ ΠΊΡƒΡ‡ΠΈ ΠΊΠΎΠ΄Π°:

			const arrayA = [1, 2, 3, 4, 5];
const arrayB = [2, 3];

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
function intersection(a, b) {
  return a.filter(Set.prototype.has, new Set(b));
}
intersection(arrayA, arrayB); // [2, 3]
// Underscore and Lodash
_.intersection(arrayA, arrayB);
		

4. ИзбСТаниС итСрирования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· ΠΈΡ… свойства

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ:

			const dateEnum = {SHORT: 'DD/MM/YY', LONG: 'DD/MM/YY HH:mm'};

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (старый, Π½ΠΎ распространСнный)
var keys = [];
for(var property in dateEnum) {
    if (dateEnum.hasOwnProperty(property)) {
        keys.push(property);
    }
}
console.log(keys); //['SHORT', 'LONG']

// Π’ JavaScript появился Π½ΠΎΠ²Ρ‹ΠΉ способ, Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ
Object.keys(dateEnum);

// Underscore ΠΈ Lodash
_.keys(dateEnum);
		

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ:

			const dateEnum = {SHORT: 'DD/MM/YY', LONG: 'DD/MM/YY HH:mm'};

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
var values = [];
for(var property in dateEnum) {
    if (dateEnum.hasOwnProperty(property)) {
        values.push(dateEnum[property]);
    }
}
console.log(values); // ['DD/MM/YY', 'DD/MM/YY HH:mm']

// Новый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Javascript (ES8) прСдоставляСт Ρ‚Π°ΠΊΠΎΠΉ способ
Object.values(dateEnum);

// Underscore ΠΈ Lodash
_.values(dateEnum);
		

5. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ часто Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. РСшСниС этой Π·Π°Π΄Π°Ρ‡ΠΈ довольно Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠ΅:

			const user = {name: 'John', occupation: 'Architect'};
const userAddress = {street: 'Times Square Ave', city: 'New York'}

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
function copyObject(obj, obj2) {
    for (var key in obj2) {
        obj[key] = obj2[key];
    }
    return obj;
}
copyObject(user, userAddress); // {name: 'John', occupation: 'Architect', street: 'Times Square Ave', city: 'New York'}

// ES6
Object.assign(user, userAddress);

// Underscore
_.extend(user, userAddress);

//Loadash
_.assign(user, userAddress);
		

6. Π¦ΠΈΠΊΠ» Π² N ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ

ΠœΡ‹ часто ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ ΠΏΠΎ массиву ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ N Ρ€Π°Π·:

			// распространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
for (var i = 0; i <= 5; i++) {
    // ...
}

// Π•Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½
Array.from({length: 5}, (v, k) => {
    // ...
});

// Underscore ΠΈ Lodash
_.times(5, (obj) => {
    // ...
});
		

7. НаличиС элСмСнта

Ѐункция ΡƒΠΆΠ΅ доступна Π² ES7, Π½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ пригодится Ρ‚Π΅ΠΌ, ΠΊΡ‚ΠΎ Π΅Ρ‰Ρ‘ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту Π²Π΅Ρ€ΡΠΈΡŽ JavaScript:

			const array = ['a', 'b', 'c'];

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
function contains(array, element) {
   return array.indexOf(element) !== -1;
}
contains(array, 'b'); // true

// ES7
array.includes('b');      

// Underscore
_.contains(array, 'b');

// Lodash
_.includes(array, 'b');
		

8. Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°

			const user = {name: 'John', occupation: 'Architect', street: 'Times Square Ave', city: 'New York'};

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
delete user.occupation;
delete user.street;
user; // {name: 'John', city: 'New York'}

// Underscore ΠΈ Lodash
_.omit(user, ['occupation', 'street']);
		

9. ΠŸΡΠ΅Π²Π΄ΠΎΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΠ΅ число ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°

ΠŸΡ€ΠΎΡ‰Π°ΠΉΡ‚Π΅, Π΄Π»ΠΈΠ½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для получСния псСвдослучайного числа ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°:

			// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
function getRandom(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}
getRandom(73, 1014);

// Underscore ΠΈ Lodash
_.random(73, 1014);
		

10. Π‘ΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ (map) для Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ способ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ массиву для возвращСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Lodash ΠΈ Underscore выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ:

			const books = [
{
    name: 'Pride and Prejudice',
    author: 'Jane Austen'
},
{
    name: 'Harry Potter and the Prisoner of Azkaban',
    author: 'J.K. Rowling'
}];

// РаспространСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚
books.map(book => book.name);

// Lodash
_.pluck(books, 'name');
		

11. ΠŸΡ€ΠΈΠΌΠ΅ΡΠΈ (mixins)

А Ссли послС знакомства с функциями Lodash ΠΈ Underscore Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ ΠΈΡ… Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚, Ρ‚ΠΎ ваш ΠΎΡ‚Π²Π΅Ρ‚ β€” примСси. Π‘ ΠΈΡ… ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

			// Underscore and Lodash
_.mixin({
  capitalize: function(string) {
    return string.charAt(0).toUpperCase() + 
                   string.substring(1).toLowerCase();
  }
});

_.capitalize("john"); // John
		

Π‘ΠžΠΠ£Π‘: ΠŸΡ€ΠΈΠΌΠ΅ΡΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ я часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ Π² своСм ΠΊΠΎΠ΄Π΅ для получСния Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π½Π΅ опасаясь, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ null:

			// Underscore
_.mixin({
    getValue(obj, path) {
        if (typeof obj === 'undefined' || obj === null) return;
        path = path.split(/[\.\[\]\"\']{1,2}/);
        for (let i = 0, l = path.length; i < l; i += 1) {
             if (path[i] !== '') {
                 obj = obj[path[i]];
                 if (typeof obj === 'undefined'
                            || obj === null) 
                     return;
                 }
        }
        return obj;
    }
});
const user = {name: 'John', address: [{street: 'River Ave'}]};
_.getValue(user, 'address[0].street'); // River Ave

// НС Π²ΠΎΠ»Π½ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΎ Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ всСх Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²
_.getValue(user, 'occupation[9].company'); // null

// Lodash ΡƒΠΆΠ΅ позаботился ΠΎΠ± этом
_.get(user, 'occupation[9].company'); // null
		
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ