[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);
});
function(){...}
, а выражение users.sort(...)
button.addEventListener('click', function() {
users.sort(
function(a, b){
return b.age-a.age
}
)
});
// или покороче
button.addEventListener('click', () => users.sort((a, b) => b.age - a.age));
Так только по событию клика массив, наконец, отсортируют. // элементы
const in_1 = document.getElementById("input_1");
const in_2 = document.getElementById("input_2");
const btn = document.getElementById("btn");
// функция проверки и вкл/выкл кнопки
const check = () => btn.disabled =
in_1.value.length < 3 || in_2.value.length < 3;
// проверять при изменении инпутов
in_1.addEventListener('input', check);
in_2.addEventListener('input', check);
// проверить разок в самом начале
check();
// исходное определение:
const flip(f) => (a, b) => f(b, a);
// можно развернуть:
function flip(sourceFunction) {
return function(a, b) {
return sourceFunction(b, a);
}
}
Функция flip()
принимает аргументом функцию. И возвращает новую функцию.function flip(f) {
// ура, нам дали какую-то исходную функцию!
var sourceFunction = f; // для красоты запишем её в свою переменную
// можно и вызвать её при желании: sourceFunction(4, 5)
// но пока не будем. Рано. Ждём.
// сделаем новую, хакерскую функцию
var hackerFunc = function(a, b) {
// тут пусть всю работу делает старая функция
var result = sourceFunction(a, b);
// стоп. Не то. Надо же аргументы местами поменять
var result = sourceFunction(b, a);
// хакерский результат
return result;
} // конец определения хакер-функции
// вернём теперь хакер-функцию:
return hackerFunc;
}
Вот как flip(f) возващает новую хитрую хакерскую функцию.