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]);
:invalid
inArray()
возвращает функцию. Эта ф-я проверяет, входит ли переданный ей аргумент в массив, с которым она создавалась. const myInArray = inArray([1,2,3]);
myInArray(4) // false
myInArray(1) // true
filter()
– т.е. из него остаются только те элементы, для которых функция вернёт true
. image.value // будет undefuned
image.getAttribute('value') // "5" — строка текста!
if (value++ === 5) {
break;
}
id
в ваших объектах?нет у item'а свойства "index". Тогда уж, возвращайте переданный index:const indexArr = users.map(( item, index ) => item.index)
(item, index) => index
Впрочем, индексы выводить, скорее всего, не нужно — для чего печатать числа от 0 до N.const fullNames = users.map( fullName ).filter(( item, index, array ) => { return array.indexOf( item ) === index })
.map()
создаётся новый массив, состоящий только из полных имён. Функцию fullName()
вы не привели в вопросе, но скорее всего, она из item'а делает строку item.name + ' ' + item.lastName
['Вася', 'Оля', 'Вася']
0
- в нулевой позиции он нашёлся. Для первого Васи это ок, он останется. Зато для третьего Васи индекс будет 2
, а поиск вернёт всё тот же 0
. Так как 2 !== 0
, дубликат-Вася вылетает и не попадает в результат. length
под этим углом:const { documentElement: el } = document;
const [cx, cy] = [el.clientWidth / 2, el.clientHeight / 2];
const angle = Math.atan2(y - cy, x - cx);
const length = 50;
const [bx, by] = [cx + length * Math.cos(angle), cy + length * Math.sin(angle)];
// рисуем линию из (cx, cy) в (bx, by)
ctx.translate(width/2, height/2)
— и центр (0, 0) теперь будет в центре холста. console.log(speechSynthesis.getVoices()); // много лучше
console.log(
speechSynthesis.getVoices()
.map(voice => `${voice.name} (${voice.lang})`)
.join("\n")
);
/*
Alex (en-US)
Alice (it-IT)
Alva (sv-SE)
Amelie (fr-CA)
Anna (de-DE)
...
*/
А: 30%
B: 65%
С: 5%
Отрезок получится: [0..30) [30..95) [95..100)