d
делается с помощью тега animate
, где указываются атрибуты from
и to
– состояния из которого, и куда.d
, но останется ощущение «шагов» в таком движении.city
объекта user — опционально.friends.items[42]
– возможно, кто-то не указал свой город, и ваш скрипт не создал для него поле coords
.else
в условии if (item.city) {
// ...
}
const langTests = {
'en': textEn,
'ru': textRu,
};
const getText = (lang) => {
const tests = langTests[lang];
return tests[Math.floor(Math.random() * tests.length)];
}
let language = 'en';
getText(language) // 'test2'
filter-name
,arr.reduce((acc, cur) => {
if (cur.name === 'filter-name') acc.push({});
acc[acc.length - 1][cur.name] = cur.value;
return acc;
}, []);
'1'
и заголовок становится 2 - click again!1
indexOf()
начнёт ошибаться — а номер заголовка.const headers = ['Мойте руки', 'Сидите дома', 'Помогайте соседям', ];
let currentHeader = 0;
$('#header').on('click', function() {
$(this).text(headers[currentHeader]);
currentHeader += 1;
currentHeader %= headers.length;
});
qq
, raysa
, j
?qq
у всех лучей рано или поздно становится 1
и у них перстают обновляться координаты.isStopped
const ctx = document.getElementById("canvas").getContext("2d");
const gun = {
x: 10,
y: 10,
}
const rays = [];
const blocks = [];
for (let i = 0; i < 20; i++) {
rays.push({x: 0, y: 0,
angle: i,
radius: 0,
isStopped: false,
raysa: 0
});
}
blocks.push({x: 20, y: 20});
function draw() {
rays.forEach(ray => {
const radians = ray.angle / 180 * Math.PI;
if (!ray.isStopped) {
ray.x = Math.cos(radians) * ray.raysa + gun.x;
ray.y = Math.sin(radians) * ray.raysa + gun.y;
ray.radius = ray.raysa;
if (ray.x >= 100) ray.isStopped = true;
ray.raysa += 1;
if (ray.isStopped) {
ray.x = Math.cos(radians) * ray.radius + gun.x;
ray.y = Math.sin(radians) * ray.radius + gun.y;
}
}
ray.angle += 2;
if (i % 10 == 0) console.log(ray.angle);
ctx.clearRect(0, 0, 320, 320);
ctx.beginPath();
ctx.moveTo(gun.x, gun.y);
ctx.lineTo(ray.x, ray.y);
ctx.stroke();
});
}
//setInterval(draw,20);
const src = '"По приказу ОАО "Рога и Копыта""';
src.split('').reduce((acc,c,i,arr) => {
if (c === '"') {
const prev = i ? arr[i - 1] : '';
if (i && prev !== ' ') {
if (prev === '"') return acc;
acc += '»';
} else {
acc += '«';
}
} else {
acc += c;
}
return acc;
}, '')
const requote = source => {
const Q_OPEN = 1;
const Q_CLOSE = 2;
const SPACE = 3;
const OTHER = 4;
let prev = SPACE;
return source.split('').reduce((acc, c, i, arr) => {
if (c === '"') {
if (prev !== SPACE) {
if (prev === Q_CLOSE) return acc;
acc += '»';
prev = Q_CLOSE;
} else {
acc += '«';
prev = Q_OPEN;
}
} else {
acc += c;
prev = c === ' ' ? SPACE : OTHER;
}
return acc;
}, '')
}
requote(src)
class Q {
constructor() {
this.promise = Promise.resolve();
}
makePromise(cb) {
return new Promise(res => setTimeout(
() => {
cb();
res();
},
1e3
));
}
enqueue(cb) {
this.promise = this.promise
.then(() => this.makePromise(cb));
return this;
}
}
const cell = new Q();
cell.enqueue(() => console.log(1));
cell.enqueue(() => console.log(2));
cell.enqueue(() => console.log(3));
window.open()
не является прямым следствием действия пользователя: клика мышки, нажатия кнопки на клавиатуре. x = x + k * (xTarget - x);
y = y + k * (yTarget - y);
В этом ответе подробнее: Какой алгоритм подойдет для описания полета насекомого?const len1 = arr1.length;
const top2 = 2 * Math.floor((arr2.length - 2) / 2);
for (let id1 = 0, id2 = 0; id1 < len1; id1++, id2 = Math.min(top2, id2 + 2)) {
console.log(`name: ${arr1[id1]} val1: ${arr2[id2]} val2: ${arr2[id2 + 1]}`);
}
arr1
и arr2
, индексы по ним, соотв., хорошо назвать с теми же номерами: id1
и id2