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);
}
// имена свойств можно передавать в виде массива
const pick = (obj, keys) => Object.fromEntries(keys.map(n => [ n, obj[n] ]));
const newObj = pick(obj, [ 'b', 'c' ]);
// или как отдельные значения
const pick = (obj, ...keys) => keys.reduce((acc, n) => (acc[n] = obj[n], acc), {});
const newObj = pick(obj, 'b', 'c');
const pickExisting = (obj, keys) =>
Object.fromEntries(keys.filter(n => n in obj).map(n => [ n, obj[n] ]));
const pickOwn = (obj, keys) =>
keys.reduce((acc, n) => (Object.hasOwn(obj, n) && (acc[n] = obj[n]), acc), {});
const pick = (obj, filterFn) => Object.fromEntries(Object.entries(obj).filter(filterFn));
const obj1 = pick(obj, ([ k, v ]) => 'abc'.includes(k) && v % 2); // {a: 1, c: 3}
const obj2 = pick(obj, n => n[1] > 2); // {c: 3, d: 5}
interface RequestModel<T> extends Request {
body: T
}
class UserRegisterModel {
first_name: string;
last_name: string;
email: string;
password: string;
constructor({first_name}) {
this.first_name = firstname;
// И так все НУЖНЫЕ поля
}
}
app.post('/register', async (req: RequestModel<UserRegisterModel>, res) => {
if(req.body) {
const user = new UserRegisterModel(req.body);
// Хоба и лишних полей нет ))
}
});
new MutationObserver((mutations, observer) => {
if (mutations[0].target.classList.contains('интересующий-вас-класс')) {
observer.disconnect();
typed.start();
}
}).observe(элементНаличиеКлассаУКоторогоНадоОтследить, { attributes: true });
const stars = (n) => {
for (let r = 4; r >= 0; r--) {
const shift = r * 5;
const bits = (n & 31 << shift) >> shift;
console.log(Array(5).fill('').map((_, i) => bits & 1 << i ? '*' : ' ').reverse().join(''));
}
}
stars(0x1e8fa10); // P
stars(0x457e31); // A
****
* *
****
*
*
*
* *
*****
* *
* *
document.querySelector('.case-print')
function shortNumber(val) {
const abs = Math.abs(val);
const prefixIndex = Math.log10(abs) / 3 | 0;
return (
(val < 0 ? '-' : '') +
Math.round(abs / (10 ** (prefixIndex * 3))) +
'KMGTPEZY'.charAt(~-prefixIndex)
);
}
shortNumber(99) // '99'
shortNumber(1945) // '2K'
shortNumber(-5839465) // '-6M'
shortNumber(7e10) // '70G'