let timerTab =[];
timerTab.push([10,new Date().getTime()+6000]);
timerTab.push([11,new Date().getTime()+9000]);
setInterval(function () {
const now = Date.now();
timerTab = timerTab.filter(function (timer) {
if (timer[1] <= now) {
console.info("Таймер истек", timer[0]);
return false; // не войдет в выбранные
} else {
console.info(`${timer[0]}: ${timer[1] - now}`);
return true; // войдет в выбранные
}
})
}, 1000)
div
появляется по какому-то событию, например, клика.this.configDb = (({ user, password, connectString }) => ({ user, password, connectString }))(c);
var c = {
user: "User",
password: "Password",
connectString: "Connect String",
};
var configDb = (({ user, password, connectString }) => ({ user, password, connectString }))(c);
console.log(configDb)
// Object { user: "User", password: "Password", connectString: "Connect String" }
querySelectorAll()
сразу по нескольким селекторам.const headerNavMenu = document.querySelector('.headerNav > ul');
const menuToggle = () => {
const value = headerNavMenu.style.display;
headerNavMenu.style.display = (value == 'none' || value == '') ? 'flex' : 'none';
}
[...document.querySelectorAll('.mobileButton, .closeMobileMenu, .headerNav > ul > li')]
.forEach(el => el.addEvenetListener('click', menuToggle));
[1, 0, 1]
.map()
никак не используется значение очередного элемента el
twentyFourHours
, minutesToAdjust
, millisecondsPerMinute
console.log(timestamps.map(ts => {
const D = new Date(ts);
D.setMinutes(D.getMinutes() + 36);
return D.toISOString();
}))
1 / n
, сначала переменная val
равна 1
.n>1
, всегда 0
целых. И далее идут дробные.1
) умножаем на 10
и делим на n
.1/7
. Записываем0.
остаток 1
1 * 10 = 10
, делим 10 / 7
, получается 1 целая и 3/7 1
– первая после запятой (но она сама по себе в этой задаче никак не нужна), и остаток 3
:0.1
остаток 3
4
).1/7 = 0.142857 142857 142857 ....
1/11 = 0.09 09 09 .... Cycle length is 2.
cycle(5) = -1
cycle(13) = 6 -> 0.076923 076923 0769
cycle(21) = 6 -> 0.047619 047619 0476
cycle(27) = 3 -> 0.037 037 037 037 0370
cycle(33) = 2 -> 0.03 03 03 03 03 03 03 03
cycle(37) = 3 -> 0.027 027 027 027 027 0
cycle(94) = -1
cycle(22) = -1 since 1/22 ~ 0.0 45 45 45 45 ...
var a = 'QnA.habr.com';
Object.defineProperty(this, 'a', {
set: function(v) {console.log('Изменяют!'); this.value = v;},
value: 'QnA.habr.com'
});
то теперь любое изменение значения переменной вызовет панику в консоли:a = 'StackOver...';
// Изменяют!
let arr = [1,3,3,4,5,5,5];
function count(arr){
let cnt = 1; // один счётчик на все значения?
let map = new Map();
for(let i = 0; i< arr.length; i++){
for(let j = 0; j< arr.length; j++){ // плохо, что на каждый элемент весь массив перебираете
// получается, считаются все пары одинаковых на каждом проходе.
if(arr[i] == arr[j]){ // здесь каждый раз найдётся равенство самому себе
map.set(arr[i],cnt++); // а общий счётчик всё больше и больше
}
}
} return map;
}
console.log(count(arr));
let arr = [1,3,3,4,5,5,5];
function count(arr){
const map = new Map();
const len = arr.length;
for (let i = 0; i < len; i++) {
const value = arr[i];
if (!map.get(value)) map.set(value, 0); // создать счетчик
map.set(value, map.get(value) + 1); // увеличить на 1
}
return map;
}
console.log(count(arr));
/*
Map(4)
size: 4
<entries>
0: 1 → 1
1: 3 → 2
2: 4 → 1
3: 5 → 3
*/
catalogList
name
, можно создать объект, где это свойство будет ключом, а последний встретившийся объект с этим свойством – значением. Более поздние объекты с повторным свойством name
перезаписывают собой более ранние. В конце остаётся вытащить все значения из этого объекта:Object.values(
arr.reduce(
(acc, c) => {
c.forEach(o => acc[o.name] = o);
// получается объект acc:
// "test": {id: 1, name: 'test'},
// "test2": {id: 2, name: 'test2'},
// "test3": {id: 3, name: 'test3'},
// ...
return acc;
},
{}
)
);
{"name": "Stan", code: "dart"}
и {"name": "Stand", code: "art"}
— оба дадут отпечаток "Standart"
и посчитаются идентичными.id
, и перевести в JSON. Тут слабое место – порядок свойств. Если у одного из объектов свойства поменяют местами, алгоритм сочтёт их разными.Object.values(
arr.reduce(
(acc, c) => {
c.forEach(o => {
const source = Object.assign({}, o);
delete source.id;
const hash = JSON.stringify(source);
acc[hash] = o;
});
return acc;
},
{}
)
);
i
после обновления.i++, i++ // i === 2
i===2
(0, 1, 2 - т.е. третий, он и так пока скрыт). i===1
(т.е. второй, был видимым).0
. Остался видимым нулевой.i--
на --i
.i
может уезжать в минус.const divs = document.querySelectorAll('div')
const length = divs.length;
const btnShow = document.querySelector('.show')
const btnHide = document.querySelector('.hide')
function showVisible(visible) {
const toShow = Math.min(visible, length);
for (let i=0; i < length; i++) {
divs[i].style.display = i < toShow ? 'block' : 'none';
}
}
let visible = 0;
showVisible(visible);
btnShow.addEventListener('click', function () {
visible = Math.min(visible + 2, length);
showVisible(visible);
});
btnHide.addEventListener('click', function () {
visible = Math.max(visible - 2, 0);
showVisible(visible);
});