active
нашим и убрать остальным — для step_X
и элементов с классами .circle_X
и .line_X
.const setStep = (n) => {
const ACTIVE = 'active';
for (let i = 1; i <= 3; i++) {
const action = i === n ? 'addClass' : 'removeClass';
this[`step_${i}`][action](ACTIVE);
$(`circle_${i}`)[action](ACTIVE);
$(`line_${i}`)[action](ACTIVE);
}
}
Тут возможны сложности с получением step_X
, не известно, в каком контексте они объявлены. Но сам принцип, надеюсь, понятен. // перемешивает массив случайным образом
const shuffle = arr => {
let currentIndex = arr.length, randomIndex;
while (currentIndex > 0) {
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex--;
[arr[currentIndex], arr[randomIndex]] = [arr[randomIndex], arr[currentIndex]];
}
return arr;
};
const getRandomPairs = (arrA, arrB, n) => {
const [lengthA, lengthB] = [arrA.length, arrB.length];
const indexPairs = [];
for (let a = 0; a < lengthA; a++) {
for (let b = 0; b < lengthB; b++) {
indexPairs.push([a, b]);
}
}
shuffle(indexPairs);
indexPairs.length = Math.min(n, indexPairs.length);
return indexPairs.map(pair => [arrA[pair[0]], arrB[pair[1]]].join(' '));
};
// использование
const NAMES = ['Иван', 'Marya', 'Gendalf', 'Rick'];
const SURNAMES = ['Sus', 'Ger', 'Gray', 'Graims'];
getRandomPairs(NAMES, SURNAMES, 8);
// [ "Rick Graims", "Marya Sus", "Gendalf Gray", "Gendalf Graims", "Gendalf Sus", "Marya Gray", "Иван Gray", "Rick Sus" ]
1. Каким образом аргумент функции double() передаётся в аргумент функции, которую возвращает декоратор?
double()
в которую и передаёт аргумент, с которым её вызвали. 2. Почему не работает прямой вызов функции-декоратора? decorator(double(5))
в таком варианте аргументом в decorator()
попадает что? — не сама функция double
, а результат её выполнения с аргументом 5
.(fn2( fn1 ))(arg)
// fn2 получает аргументом функцию fn1
// возвращает новую функцию, и уже та выполняется
// с аргументом arg
fn2( fn1( arg ))
// fn1 выполняется с аргументом arg
// результат попадает аргументом в fn2
// возвращается результат вызова fn2
toString()
прекрасно сделает работёнку: (
"\u042d\u0442\u043e \u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u044b \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0439 \u0444\u0438\u0433\u043d\u0451\u0439 \u0437\u0432\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d \u0438 \u0431\u043e\u0433 \u0437\u043d\u0430\u0435\u0442 \u043a\u0430\u043a \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u043c"
).toString() // "Это текст которы ..."
1000
и 1e3
и 0x3E8
,const alpha = 'abcdefghijklmnopqrstuvwxyz'.split(''); // массив ["a", ... "z"]
'pavel'.toLowerCase().split('').map((c) => alpha.indexOf(c))
// [ 15, 0, 21, 4, 11 ]
a..z
то можно использовать UTF таблицу, где латиница с маленькой буквы начинается с 97 (совпадает с ASCII):'pavel'.toLowerCase().split('').map((c) => c.charCodeAt(0) - 97)
// [ 15, 0, 21, 4, 11 ]
let isActive = false;
– флаг состояния: активно или нет. Как сейчас у вас наличие/отсутствие слушателя.false
, input или focus – ставить true
.innerHTML = Math.round()
сейчас дважды. Достаточно явно вызвать функцию.// a и b взаимно обменялись значениями:
[ a, b ] = [ b, a ];
const arr = [1, 2, 3, 4, 5];
[arr[0], arr[4]] = [arr[4], arr[0]];
arr // [5, 2, 3, 4, 1]
initialCards.forEach(item => {
// создать карточку
const element = makeElementFromItem(item);
// установить эту карточку куда-то в DOM-дереве
document.body.appendChild(element);
});
Вам осталось реализовать функцию makeElementFromItem()
— но там в начале у вас уже есть все эти createElement()
– думаю, вы справитесь. '0.0000001024'.replace(/^0?\.?0*/, '') // получится строка "1024"
0.0000001024
после преобразования toString()
мы увидим "1.024e-7"const selectTrack = new Promise(resolve => {
document.querySelectorAll('.chartsCard')
.forEach(el => el.addEventListener('click', () => resolve(el.dataset.musicid)));
});
selectTrack.then(track => {
// тут что-то сделать с выбранным треком
console.log('выбранный трек', track);
});
const diffHours = Math.ceil((endDate - startDate) / 36e5); // точно в бОльшую сторону округлять?
const days = Math.floor(diffHours / 24);
const hours = diffHours - days * 24;
console.log(`Срок аренды: ${days} дней и ${hours} часов`);
D = new Date();
D.setHours(D.getHours() + 12) // подвинули вперёд на 12 часов
даты корректируются «автомагически».(
(start, finish) => {
const date = new Date(start);
const dateFinish = new Date(finish);
const result = [];
while (date <= dateFinish) {
result.push(date.toISOString());
date.setHours(date.getHours() + 12);
}
return result;
}
)('2020-01-01T00:00:00+03:00', '2020-03-15T11:58:01+03:00')
/*
Array(149) [ "2019-12-31T21:00:00.000Z", "2020-01-01T09:00:00.000Z", "2020-01-01T21:00:00.000Z", "2020-01-02T09:00:00.000Z", "2020-01-02T21:00:00.000Z", "2020-01-03T09:00:00.000Z", "2020-01-03T21:00:00.000Z", "2020-01-04T09:00:00.000Z", "2020-01-04T21:00:00.000Z", "2020-01-05T09:00:00.000Z", … ]
*/
element.hasAttribute('maxlength')
element.setAttribute('maxlength', 20)
document.querySelectorAll('input[type=password]')
forEach()
maxlength
;