function addPointCenter(index) {
const avg = (a, b) => (a + b) / 2;
const midPoint = (p1, p2) => ({ lat: avg(p1.lat, p2.lat), lng: avg(p1.lng, p2.lng) });
const insert = (index, point) => latlng.splice(index, 0, point);
const { length } = latlng;
const current = latlng[index];
const indexLeft = (index - 1 + length) % length;
const pointLeft = midPoint(current, latlng[indexLeft]);
const indexRight = (index + 1) % length;
const pointRight = midPoint(current, latlng[indexRight]);
insert(index + 1, pointRight);
insert(index, pointLeft);
drawMarkers();
}
dot.str('qna.habr.com', 'value', this.data);
/* this.data:
{
qna: {
habr: {
com: "value"
}
}
} */
npm install dot-object --save
isLoading
, а свойство некого объекта изменять: flags.isLoading = false;
const PERIOD = 5000;
let timeout;
const action = () => {
console.log('Action!');
// this.switchNextTab()
clearTimeout(timeout);
timeout = setTimeout(action, PERIOD);
};
const flags = {
_isLoading: false,
set isLoading(value) {
this._isLoading = value;
if (!value) {
// isLoading стал false
action();
}
},
get isLoading() {
return this._isLoading;
},
};
timeout = setTimeout(action, PERIOD);
// где-то в коде:
flags.isLoading = true;
// ...
flags.isLoading = false; // тут же выполнится action
001
010
100
Из каждой цифры (0 или 1) делается ячейка таблицы. Строки оборачиваются в тег tr
, и всё это обёртывается в table. Полученный HTML вставляется в страницу. \b
для границы слова не работают, пришлось заглядывать впрёд-назад, и регулярка вышла некороткая.Object.entries(obj)
делает из объекта массив пар [[ключ, значение], ... ]
— [
[50: "3500"],
[100, "6000"],
...
]
const findRange = n => {
const obj = {
50: "3500",
100: "6000",
200: "8000",
300: "10500",
500: "13000",
501: "индивидуально"
};
const lookup = Object.entries(obj).sort(([a], [b]) => b - a);
return (lookup.find(([k, v]) => Number(k) <= n) ?? lookup.pop())[1];
};
findRange(49) // "3500"
findRange(99) // "3500"
findRange(100) // "6000"
findRange(500) // "13000"
findRange(501) // "индивидуально"
const state = {};
const getJSON = response => response.json();
getAuth()
.then(getJSON)
.then(({ id }) => {
state.id = id;
return getUser(id);
})
.then(getJSON)
.then(user => {
state.user = user;
})
.then(() => getOrder('users', state.id))
.then(getJSON)
.then(({ order }) => state.order = order)
.catch(console.error)
.finally(() => console.log("all done", state));
возможна ли реализация данной логики с помощью Promise.allSettled?
const state = {};
// подготовка
const getJSON = response => response.json();
const getUser = id =>
fetchUser(id)
.then(getJSON)
.then(({ user }) => (state.user = user));
const getOrder = id =>
fetchOrder('users', id)
.then(getJSON)
.then(({ order }) => (state.order = order));
// поехали
getAuth()
.then(getJSON)
.then(({ id }) => {
state.id = id;
return Promise.allSettled([getUser(id), getOrder(id)]);
})
.catch(console.error)
.finally(() => console.log('all done', state));
с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, дальше проверять не пришлось
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 ]