delay()
создаёт обёртку над функцией, чтобы выполнить её через какое-то время. При этом старается ничего не сломать – передать все аргументы и сохранить контекст (this
) вызова. На всякий случай.f.apply(context, ...)
(документация) – вызовет копию функции f()
с привязанным к ней контекстом context
. Тут так сделали, чтобы наверняка передать контекст. Тот this
, что был при вызове delay()
, благополучно окажется и у вызываемой через паузу функции.delay()
– и вспоминайте про this
у функций. function delay(f, ms = 500) {
return function d() {
setTimeout(() => f.apply(this, arguments), ms);
};
}
// функция для испытаний, будет выводить this
function testThis(msg) {console.log(msg, this);}
// Test 1
delay(testThis)("Test1"); // Window
// Test 2
const obj = {
title: 'test 2',
method: delay(testThis),
};
obj.method("Test 2"); // obj {title: 'test 2', method: d()}
// Test 3
const test3 = delay(testThis).bind({title: 'test 3'});
test3("Test 3"); // Object {title: 'test 3'}
// Test 4
const maker = delay(testThis);
const M = new maker('Test 4'); // Object { }
const colors = {
'3': 'red',
'2': 'green',
'1': 'blue',
'0': 'black',
};
const setColor= input => {
const { value } = input;
if (colors.hasOwnProperty(value)) {
input.style.backgroundColor = colors[value];
}
}
const onInput = e => {
setColor(e.target);
}
document.querySelectorAll('input')
.forEach(elem => {
elem.addEventListener('input', onInput);
setColor(elem);
});
push()
возвращает новую длину массива, тут ничего не поделаешь..apply()
там зачем. Это учебное задание?newParentPath
и последнего элемента, который был в предыдущем массиве mappedPath
.mappedPath = [ ...this.newParentPath.split(', '), mappedPath.pop() ];
const D = new Date();
– создать объект Date на сейчас;D.setDate(D.getDate() + 1)
— так можно получить следующий деньD.getDay()
— получить день недели от 0 (вск) до 6 (суббота)inArray()
возвращает ... ещё одну функцию, которую только что создала при вызове:function inArray(arr) {
const result = function(x) {
// внутри этой функции будет ещё и доступен
// arr, с которым вызвали inArray()
return arr.includes(x);
};
return result;
}
Т.е. вызов inArray()
с каким-то массивом возвращает всего лишь ещё одну функцию, которая принимает любой аргумент, но ещё и «запомнила» конкретный arr
, с которым её создали.const myFilter = inArray([1, 2, 10]);
это свежесозданная функция, которая для любого аргумента возвращает true/false — есть ли это же значение в массиве [1, 2, 10]
const maskCcNumber = num => {
const str = num.toString();
const length = str.length;
const keep = 4;
if (length < keep) return str;
const star = '*';
return str.substring(0, 4) + star.repeat(length - 4);
}
maskCcNumber(454511111111112) // 4545***********
"454511111111112".replace(/(.{4})(.*)/, (_, p1, p2) => p1 + '*'.repeat(p2.length))
см. String.replace() -numbers += 1;
+numbers -= 1;
from
, но отсутствует в to
. От него пляшем по цепочке, добавляя инкрементируемое свойство для сортировки.const allFrom = tickets.map(item => item.from);
const allTo = tickets.map(item => item.to);
let city = allFrom.filter(item => !allTo.includes(item)).pop(); // первый город
const w = Symbol(); // чтобы случайно не затереть существующее свойство
let i = 0;
let ticket;
while (ticket = tickets.find(t => t.from === city)) {
ticket[w] = i++;
city = ticket.to;
}
// ура! сортировка!
tickets.sort((a, b) => a[w] - b[w]);
tickets.forEach(t => delete t[w]);