fetch()
. Устанавливается соединение, передаётся запрос «дай /api/method» и передаются заголовки, типа «готов принять json».HTTP/1.1 200 OK
– мол, норм, ща всё будет.fetch
уже понимает, как у него дела с этим запросом. И ресолвит первый промис. Уже ясно, что вроде всё ок, ща польют данные, и это надолго. Дальше вступает в работу объект Response..json()
промис. Посмотрите по ссылке — у того же объекта (мы его получаем после первого ресолва fetch()
) есть и свойства, доступные сразу же, синхронно: например, объект с заголовками: свойство headers
. Или свойство ok
, значение которого следует из самой первой строки ответа сервера.this
.logger()
в вашем примере, this === window
.randNum
содержит число.questFunc()
возвращает строку с текстом вопроса.people[`${questFunc()}`]
это, например, people["Это девушка?"]
– будет undefined
.people
не имеет строкового ключа. В нём два элемента с индексами 0 и 1.const questions = [
'Это самец?',
'Это девушка?',
'Носит очки?',
'Занимается спортом?',
'У этого человека смуглая кожа?',
];
const people = [
{ name: 'Егор', profile: [1, 0, 1, 1, 1] },
{ name: 'Залина', profile: [0, 1, 1, 1, 0] },
];
const questionElement = document.querySelector('.question');
let questionIndex; // индекс текущего вопроса
function askQustion() {
questionIndex = Math.floor(Math.random() * questions.length);
questionElement.innerHTML = questions[questionIndex];
return questions[questionIndex];
}
askQustion();
// TODO: принять ответ пользователя (true/false)
const answer = true; // допустим, ответил "да"
const candidates = people
.filter(({ profile }) => !!profile[questionIndex] === answer)
.map(({ name }) => name)
.join(', ');
console.log('Кандидаты:', candidates);
#container
, а MutationObserver это замечает и пишет в #log
:const nodes = [ ...document.querySelector('td').childNodes ];
const index = nodes.findIndex(({ nodeName }) => nodeName === 'BR');
if (index > -1) nodes[index + 1].remove();
Находим все узлы DOM внутри td
. Их будет 3:sort()
изменяет сам массив.myFunction()
без второго аргумента, возвращается массив как есть. Как отсортировали его предыдущим вызовом.function myFunction(arr, str) {
const sortedArray = arr.slice(); // копия, чтобы не менять оригинал
if (str === 'asc') {
sortedArray.sort((a, b) => a - b);
} else if (str === 'dsc') {
sortedArray.sort((a, b) => b - a);
}
return sortedArray;
}
console.log(myFunction([1, 4, 3, 2], 'asc')); // [ 1, 2, 3, 4 ]
console.log(myFunction([1, 4, 3, 2], 'dsc')); // [ 4, 3, 2, 1 ]
console.log(myFunction([1, 4, 3, 2])); // [ 1, 4, 3, 2 ] без изменений
last
(не знаю, откуда взялось last_price
)function handleFiles(files) {
for (let i = 0; i < files.length; i++) {
const file = files[i];
if (!file.type.startsWith('image/')){ continue }
const img = document.createElement("img");
img.classList.add("obj");
img.file = file;
preview.appendChild(img); // Assuming that "preview" is the div output where the content will be displayed.
const reader = new FileReader();
reader.onload = (e) => { img.src = e.target.result; };
reader.readAsDataURL(file);
}
}
const oo = n => n.toString().padStart(2, '0');
const formatDate = date => {
const d = new Date(date);
const month = oo(d.getMonth() + 1);
const day = oo(d.getDate());
const year = d.getFullYear();
return [year, month, day].join('-');
};
const onMessage = (data, cred) => {
const { time_mark: timeMark, id, nick, content } = data;
const { nick: credNick } = cred;
const msgDate = formatDate(timeMark);
const currentDate = formatDate(new Date());
const date = new Date(timeMark); // 2009-11-10
const time = [date.getHours(), date.getMinutes()].map(oo).join(':');
let Strtime;
if (msgDate === currentDate) {
Strtime = 'Сегодня в ' + time;
} else {
const month = date.toLocaleString('default', { month: 'long' });
Strtime = `${oo(date.getDay())} ${month} ${date.getFullYear()}, в ${time}`;
}
$('#msg-container').append(`
<div class="msg-box" id='${id}' class="${nick === credNick ? '' : 'not-my'}">
<p class="author">${nick}</p>
<p class="msg-text">${content}</p>
<span class="time">${Strtime}</span>
</div>
`);
};
$(document).ready(() => {
check();
const socket = io();
const cred = JSON.parse(localStorage.getItem('userData'));
$.ajax({
url: '/getmessage',
type: 'POST',
success({ status, msg, data }) {
if (status === 'err') {
return new Notification('Ошибка', { body: msg });
}
data.forEach(message => onMessage(message, cred));
$('#all_mess').scrollTop($('#msg-container').height());
},
});
socket.emit('hello', { nick: cred.nick });
$('#messForm').submit(e => {
e.preventDefault();
const msg = $('#message').val();
if (msg) {
socket.emit('sendMess', { token: localStorage.getItem('token'), msg });
$('#message').val('');
}
});
socket.on('addMess', data => {
onMessage(data, cred);
$('#all_mess').scrollTop($('#msg-container').height());
});
socket.on('toLogin', () => {
window.location.href = '/auth';
});
socket.on('helloMess', str => {
$('#msg-container').append(`<span class="hello">${str.mess}</span>`);
$('#all_mess').scrollTop($('#msg-container').height());
});
});
function hideEl() {
$('.hello').hide();
}
this.selectedNodesInfo = selectedItems.map(({ id, IADDRESS_LEVELID, [fieldName]: name }) => {
const result = { name: name ?? id, id };
if (this.isAddress) {
result.IADDRESS_LEVELID = IADDRESS_LEVELID;
}
return result;
});
this.selectedNodesInfo = selectedItems.map(({ id, IADDRESS_LEVELID, [fieldName]: name }) => ({
name: name ?? id,
id,
...(this.isAddress ? { IADDRESS_LEVELID } : null),
}));
const params = (new URL(document.location)).searchParams;
const utmCampaign = params.get('utm_campaign');
const campaignTexts = {
'vk_001': 'Привет, куплю ваших слонов в ВК!',
'vk_002': 'Привет, куплю ваших слонов в группе!',
'fb_001': 'Привет, куплю ваших слонов в Facebook!',
};
const text = encodeURIComponent(campaignTexts[utmCampaign] ?? 'Привет по умолчанию!');
const randomUrl = `https://wa.me/${phone}?text=${text}`;
const phones = [
{ p: '9171857450', c: 1 },
{ p: '9880735438', c: 10 },
{ p: '9880735439', c: 100 },
{ p: '9880735779', c: 2 },
{ p: '9170997305', c: 2 },
{ p: '9170997493', c: 2 },
{ p: '9880634879', c: 5 },
{ p: '9170996154', c: 1 },
{ p: '9880728447', c: 1 },
];
const chancesTotal = phones.reduce((acc, { c }) => acc + c, 0);
const selected = Math.floor(Math.random() * chancesTotal);
let phone;
for (let i = 0, sum = 0; i < phones.length; i++) {
sum += phones[i].c;
if (selected < sum) {
phone = phones[i].p;
break;
}
}
const randomUrl = `https://wa.me/${phone}?text=Привет!%20Пришлите%20мне%20цены%20на%20рыбку!`;
const arr = [0, 1, 2, 3, 4, 5];
const index = 3;
[ ...arr.slice(0, index), 'Habr', ...arr.slice(index + 1) ]
// [ 0, 1, 2, "Habr", 4, 5 ]
Делается новый массив, в котором сначала идут элементы исходного от 0
до index
(не включая index);index
на некий новый. В отличие от метода splice()
, которым можно было бы сделать тоже самое arr.splice(index, 1, 'Habr')
, вариант в вопросе не изменяет исходный массив, а создаёт новый – что, в общем-то, «правильно». const sortUp = () => {
const parent = document.querySelector('div.t-input-phonemask__options-wrap > noindex');
const goFirst = ['ru', 'ua', 'kz'];
goFirst.reverse().forEach(cc => {
parent.insertAdjacentElement('afterbegin', parent.querySelector('#t-phonemask_' + cc));
});
};
setTimeout(sortUp, 1000);
P.S. стоит Тильде чуть что-то поменять, изменить названия классов — перестанет работать. {n,m}
./5{1,3}/
соответствует цифре 5 повторяющейся от 1 до 3 раз.const re = /(([1-68])\2{0,2}|([79])\3{0,3}|0)/g;
"443777771999990005555551".match(re).join(', ')
// "44, 3, 7777, 7, 1, 9999, 9, 0, 0, 0, 555, 555, 1"
(A|B|C) == "A" ИЛИ "B" ИЛИ "C"
[a-z] == любой один от "a" до "z"
[1-68] == цифра от 1 до 6 или 8
\2
или например \3
– отсылка к ранее захваченному в круглых скобках фрагменту/([79])\2{0,2}/
цифра 7 или 9. Сразу после неё – её же повтор от 0 до 2 раз. Т.е. в сумме это цифра 7 или 9, идущая до 3 раз подряд.