const getSeconds = str =>
[
[ 'де?н', 24 * 60 * 60 ],
[ 'час', 60 * 60 ],
[ 'мин', 60 ],
[ 'сек', 1 ],
].reduce((acc, n) => {
return acc + (str.match(RegExp(`\\d+(?=\\s+${n[0]})`)) ?? 0) * n[1];
}, 0);
getSeconds('2 часа 22 секунды') // 7222
getSeconds('99 минут') // 5940
getSeconds('1 час 1 минута 1 секунда') // 3661
getSeconds('1 день 23 часа 59 минут 60 секунд') // 172800
getSeconds('2 дня') // 172800
getSeconds('546 секунд и ещё 2 минуты') // 666
const rangeVideo = async (player, mimeCodec, resource) => {
const mediaSource = new MediaSource;
player.src = URL.createObjectURL(mediaSource);
await new Promise(resolve => mediaSource.onsourceopen = resolve);
URL.revokeObjectURL(player.src);
const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
const response = await fetch(resource, { method: 'HEAD' });
const contentLength = response.headers.get('Content-Length');
const segmentLength = 1 * 1024 * 1024;
let fetchedLength = -1;
while (true) {
if (fetchedLength >= contentLength) break;
const response = await fetch(resource, {
headers:{'Range':`bytes=${fetchedLength+1}-${fetchedLength+=segmentLength}`}
});
const value = await response.arrayBuffer();
sourceBuffer.appendBuffer(value);
await new Promise(resolve => sourceBuffer.onupdateend = resolve);
//console.count();
//await delay(2000);
}
};
const streamVideo = async (player, mimeCodec, resource) => {
const mediaSource = new MediaSource;
player.src = URL.createObjectURL(mediaSource);
await new Promise(resolve => mediaSource.onsourceopen = resolve);
URL.revokeObjectURL(player.src);
const sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
const response = await fetch(resource);
const readableStream = response.body;
const reader = readableStream.getReader();
while (true) {
const { value, done } = await reader.read();
if (done) break;
sourceBuffer.appendBuffer(value);
await new Promise(resolve => sourceBuffer.onupdateend = resolve);
//console.count();
}
};
//const delay = ms => new Promise(resolve => setTimeout(resolve, ms));
const data = [
document.querySelector('video'),
'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
'https://nickdesaulniers.github.io/netfix/demo/frag_bunny.mp4',
];
//rangeVideo(...data);
//streamVideo(...data);
indexOf( ID )
в массиве, задающем порядок сортировки:var data = [
{ID: 1, country: 'England'},
{ID: 4, country: 'USA'},
{ID: 9, country: 'Russia'},
{ID: 5, country: 'Germany'},
{ID: 6, country: 'France'},
];
const order = [5,1,9,6,4];
data.sort((a,b) => order.indexOf(a.ID) - order.indexOf(b.ID));
/* [
{"ID":5,"country":"Germany"},
{"ID":1,"country":"England"},
{"ID":9,"country":"Russia"},
{"ID":6,"country":"France"},
{"ID":4,"country":"USA"}]
*/
data = data.map( e => {e.sortBy = order.indexOf(e.ID); return e;} );
data.sort( (a,b) => a.sortBy - b.sortBy);
- i while(<= arr){
+ i while(<= arr.length){
function one() {
const oneVar = 'Hello!'
let counter = 0;
console.log('функция one работает прямо сейчас, в счетчике', counter)
function two() {
console.log(oneVar, ++counter)
}
console.log('функция one почти завершилась, в счетчике все еще ', counter);
return two
}
const three = one();
console.log('функция one точно завершилась, даже return сработал');
console.log('в переменной three сейчас функция two()');
console.log(three);
three();
three();
three();
console.log('обожемой, мы видим как менялась переменная в уже завершенной функции. чераная магия? нет - это называется замыкание!');
"функция one работает прямо сейчас, в счетчике", 0
"функция one почти завершилась, в счетчике все еще ", 0
"функция one точно завершилась, даже return сработал"
"в переменной three сейчас функция two()"
function two() {
console.log(oneVar, ++counter)
}
"Hello!", 1
"Hello!", 2
"Hello!", 3
"обожемой, мы видим как менялась переменная в уже завершенной функции. чераная магия? нет - это называется замыкание!"
Consistent useEffect timing: React now always synchronously flushes effect functions if the update was triggered during a discrete user input event such as a click or a keydown event.
document
, дальше событие клика по кнопке продолжило всплывать и попало в только что установленный обработчик.При добавлении задержки, данная проблема уходит
document.addEventListener('click', handleOutsideClick, true);
return () => document.removeEventListener('click', handleOutsideClick, true);
user = new User()
{ constuctor: User }
. Если писать через class то мы конструктор явно прям зададим. )user.__proto__ === User.prototype
User.prototype.constructor === User
function User(x,y){
let name = x;
let age = y;
return {
name : name,
age : age,
sayHi: function(){
console.log("My name is " + this.name);
}
}
}
// Сохраняем исходные индексы и сортируем по высоте по убыванию
const preparedData = data
.map((e, i) => ({i, e}))
.sort((a, b) => b.e.height - a.e.height);
for (const el of preparedData) {
const { height } = el.e;
// тут никогда не вернет -1, так как мы ищем элемент который точно есть в массиве - минимальный
const index = columnHeight.indexOf(Math.min(...columnHeight));
// обновляем данные массивов по выбранному индексу
columnHeight[index] += height;
columns[index].push(el);
}
// нормализуем columns
for (let i = 0; i < columns.length; ++i) {
// восстановим исходный порядок, отсортировав по сохраненному индексу по возрастанию
columns[i].sort((a, b) => a.i - b.i);
// избавимся от сохраненных индексов, оставив только исходные объекты
columns[i] = columns[i].map(({ e }) => e);
}