$start = new DateTimeImmutable('1878-10-11');
$finish = new DateTimeImmutable('2009-10-13');
$interval = $start->diff($finish);
$daysDiff = $interval->format('%a');
$randomDays = rand(0, $daysDiff);
$randomDate = $start->add(new DateInterval("P${randomDays}D"));
echo $randomDate->format('Y-m-d'); // 1896-06-24
.htaccess
в конфиг NGINX. С помощью Google, SO и Habr.QnA )/index.php
, а там уже логика внутри PHP узнавала запрошенный URL /section1/page2
и отдавала соответствующий ответ. Такие решения универсальны относительно веб-сервера..htaccess
иногда кладут в проект, потому, что это легкий невидимый файл, который не помешает. Но поможет понять ожидаемое поведение веб-сервера. Конфиги NGINX лежат отдельно от проекта, поэтому их не прилагают. Хотя иногда приводят пример в документации. сtx.telegram
.sendPhoto(
ctx.chat.id,
ctx.message.photo[0].file_id,
{ caption: s, parse_mode: 'HTML', reply_markup: markup }
)
telegram.sendPhoto()
(исходник) передаётся через функцию fmtCaption()
(код) в api тележки, и доп. параметры помимо caption
должны пройти без изменений. (names =>
names.forEach(name => {
document.getElementsByClassName(name).forEach(({ style }) => {
style.display = name;
});
}))(['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption']);
peresortDel
вешается слушатель события клика.forEach()
передается функция, которую применят к каждому элементу.click
— тоже функция. Другая, чем в п.1, поэтому их тут.. две.forEach()
, и не создавать новую функцию для каждого элемента.commonParent.addEventListener('click', ({ target }) => {
if (!target.classList.contains("tot-samyj-class")) return;
target.style.display = "none";
});
Подробнее не подскажу, т.к. в вопросе нет действующего примера или хотя бы разметки. const normalize = obj => {
const result = { ...obj }; // shallow copy
const k = 360 / Object.values(result).reduce((acc, c) => acc + c);
for (const prop in result) result[prop] *= k;
return result;
};
оператор ИЛИ возвращает последнюю правду, а по факту дает True, а не 5. Ведь 5 в этом контексте тоже true
||
возвращает первую правду. И дальше не проверяет. Т.е. 3 > 1 === true
||
приоритет ниже ↓, чем у &&
↑. Очерёдность выполнения: 5 === 5 && 3 > 1 || 5
(5 === 5 && 3 > 1) || 5
// && проверит, чтобы все были true
// и вернёт последний, т.е. вернёт 3 > 1 === true
// || увидит, что уже есть true и вернёт его, не проверяя 5
do {} while ()
и if (condition) {}
function foo() {}; // пустой блок
foo({}); // передали пустой объект аргументом
{} // пустой блок инструкций
({}) // отдельно висящий никому не нужный пустой объект
[{}] // создали массив с пустым объектом
{[]} // внутри блока создали пустой массив и забыли про него
«Умные» редакторы кода подсвечивают усы разными цветами и ругаются на бессмысленность for()
сходу устанваливает ограничения и следит за тем, чтобы на каждой итерации все эти i, j
увеличивались.while()
— опасный анархист. Легко впадает в бесконечный цикл, если в каком-то из условий забыть i = i + 1
Что у вас в последней попытке и присутствует:«Нет выхода», еслиbutthurt: while (i <= 10) { while (j < i) { alert('Внутренний цикл ' + j); if (i % j === 0) continue butthurt;
i % j === 0
: никто из них не поменяется и будет крутиться бесконечно.const LIMIT = 10;
let i = 2;
while (i <= LIMIT) {
let j = 2;
let isPrime = true;
while (j < i && isPrime) {
alert(`Внутренний: ${i} / ${j}`);
if (i % j === 0) isPrime = false; // делится, значит не простое
j++;
}
alert(`Внешний: ${i} - ${isPrime ? 'ПРОСТОЕ' : 'не простое'}`);
i++;
}
Отказался от меток циклов и от continue – нежелательны именно из-за вносимой путаницы. const timeFromBackend = "2022-11-15T20:00:00Z";
const localTime = new Date(timeFromBackend); // 23:00 Msk
const oo = n => n.toString(10).padStart(2, '0');
const YYYY = localTime.getFullYear();
const MM = oo(localTime.getMonth() + 1);
const DD = oo(localTime.getDate());
const HH = oo(localTime.getHours());
const II = oo(localTime.getMinutes());
const localTimeForInput = [YYYY, MM, DD].join('-') + 'T' + [HH, II].join(':');
console.log(localTimeForInput); // 2022-11-15T23:00
const timeFromBackend = "2022-11-15T20:00:00Z";
const localTime = new Date(timeFromBackend); // 23:00 Msk
const shiftedTime = new Date(localTime);
shiftedTime.setMinutes(shiftedTime.getMinutes() - shiftedTime.getTimezoneOffset());
const timeForInput = shiftedTime.toISOString().substring(0, 16);
console.log(timeForInput); // "2022-11-15T23:00"
const timeFromInput = "2022-11-15T22:00";
const date = new Date(timeFromInput);
const timeForBackend = date.toISOString().substring(0, 19) + 'Z';
console.log(timeForBackend) // "2022-11-15T19:00:00Z"
&&
и ||
возвращают свои операнды:1 && "2" // строка "2"
0 && "2" // число 0
0 || "2" // строка "2"
1 || false // число 1
&&
: для позитивного результата нужно, чтобы оба операнда были как-true. Проверка идёт слева направо. Как только наткнулись на как-false, возвращается он. Прошли всю цепочку и все по пути были как-true — вернули последний из них.||
даст позитивный результат, как только наткнётся хоть на один как-true. Его и вернёт. Ну или проверит все значения и если все как-false, вернёт последний из них.1 && "2" && "habr" // вернёт "habr"
"1" && 0 && "qna" // 0
0 || false || "habr" === "qna" // false, результат ("habr" === "qna")
0 || 1 || 2 || true // 1, дальше проверять не пришлось
/usr/local/bin/
или /usr/local/sbin/
например. render
находится в одном объекте, который под ключом "settings".data
– в другом объекте, который под ключом "template".const store = [
{
template: {
data: [1, 2, 3],
},
settings: {
get render() {
console.log(store[0].template.data);
},
},
},
];
store[0].settings.render // [ 1, 2, 3 ]
const dateTwoMonthsBack = new Date();
dateTwoMonthsBack.setMonth(dateTwoMonthsBack.getMonth() - 2);
const id = 'testId'; // TODO: remove
const params = {
page_size: 200,
manager: id,
last_kpi_graded__lte: dateTwoMonthsBack.toISOString().substring(0, 10),
};
const url =
'http://10.1.5.65/api/personal/users/?' +
Object.entries(params)
.map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
.join('&');
console.log(url);
// http://10.1.5.65/api/personal/users/?page_size=200&manager=testId&last_kpi_graded__lte=2022-09-16
// fetch(url);
_________zzzoooABCuuu
xxxABCiii |||
xxxABCiii |||
xxxABCiii |||
... |||
xxxABCiii
...
xxxABCiii
Начать ещё до их пересечения – это максимально возможное их несовпадение.function mostCommon(a, b) {
const A = a.split('');
const B = b.split('');
const min = {
diff: A.length + B.length,
index: -A.length,
start: undefined,
finish: undefined,
};
for (let offset = -A.length; offset < B.length; offset++) {
let diff = Math.max(0, -offset) + Math.max(offset + A.length - B.length, 0);
const initialDiff = Math.max(0, -offset) + Math.max(offset + A.length - B.length, 0);
const start = Math.min(Math.max(0, offset), B.length);
const finish = Math.min(Math.max(0, offset + A.length), B.length);
let matchStart;
let matchFinish;
for (let i = start, isMatchStarted = false; i < finish; i++) {
if (B[i] !== A[i - offset]) diff++;
else {
if (!isMatchStarted) {
matchStart = i;
isMatchStarted = true;
}
matchFinish = i;
}
}
if (diff < min.diff) {
min.diff = diff;
min.index = offset;
min.start = matchStart;
min.finish = matchFinish;
}
}
console.log(min, b.substring(min.start, min.finish + 1));
return min;
}
mostCommon('xxx>abcABCxxx', 'bbbzzz>abcAXCiiiqqq');
// { diff: 7, index: 3, start: 6, finish: 12 } >abcAXC
mostCommon("1246380924534", "88899212465809");
// { diff: 6, index: 6, start: 6, finish: 13 } 12465809