function addFilter(filter) {
const delimiter = ',';
// разобрать хэш
const str = location.hash;
const hashes = str.slice(str.indexOf('#') + 1).split('&')
const params = {}
hashes.forEach(hash => {
if (!hash) return;
const [key, val] = hash.split('=')
params[key] = decodeURIComponent(val)
})
// параметр фильтров разобрать, добавить, собрать
const filters = params.search ? params.search.split(delimiter) : [];
filters.push(filter); // ["Toster", "Habr"]
params.search = filters.join(delimiter);
// собрать обратно
hashes.length = 0;
for (p in params)
hashes.push([p, encodeURIComponent(params[p])].join('='));
location.hash = '#' + hashes.join('&');
}
addFilter('Toster');
addFilter('Habr');
//#search=Toster%2CHabr
const value = 1 + 1 * 1;
var a = {
b: value,
b1: value
}
// хочется так? (но нельзя!)
var a = {
b: 1,
c: this.b * 10
}
// тогда можно так:
var a = {
get c() { return this.b * 10; }
}
a.b = 1;
a.c // 10
function testFunction(name, data) {
data.param1 = name;
}
const obj = {
param1: 1,
param2: 2
}
testFunction('test', obj);
obj.param1 // "test"
setDate(1)
, setMonth(0)
и прибавлять по 1 дню. Месяца перевернутся автомагически.mm/dd/yyyy
можно использовать локальный формат дат для США, указав в опциях, что даты и месяц выводить как 2-цифры.const dates = [];
const options = { year: 'numeric', month: '2-digit', day: '2-digit' };
const d = new Date();
d.setMonth(0);
d.setDate(1);
const year = d.getFullYear();
while(d.getFullYear() === year) {
dates.push(d.toLocaleDateString('en-US', options));
d.setDate(d.getDate() + 1);
}
/*
01/01/2019
01/02/2019
01/03/2019
01/04/2019
01/05/2019
01/06/2019
01/07/2019
01/08/2019
01/09/2019
01/10/2019
...
*/
while (start < end) {
array[start++] = value;
}
Array.fill()
, ...filler
Promise.all()
asyncX()
возвращали промисы:const yourXFunction = (async1, async2, async3, someCallback) => {
let latest; // последнее значение остаётся
Promise.all([
async1().then(v => {latest = 1; return v;}),
async2().then(v => {latest = 2; return v;}),
async3().then(v => {latest = 3; return v;}),
]).then(results => {
console.log("Last was async" + latest);
someCallback(results[latest - 1]);
});
}
const yourXFunction = (async1, async2, async3, someCallback) => {
let latest; // последнее значение остаётся
Promise.all([
wrap(async1).then(v => {latest = 1; return v;}),
wrap(async2).then(v => {latest = 2; return v;}),
wrap(async3).then(v => {latest = 3; return v;}),
]).then(results => {
someCallback(results[latest - 1]);
});
}
const wrap = (f) => new Promise((res, rej) => f(res));
const async1 = (cb) => {
setTimeout(() => {
cb(1);
}, 4000);
};
const async2 = (cb) => {
setTimeout(() => {
cb(13);
}, 6000);
};
const async3 = (cb) => {
setTimeout(() => {
cb(5);
}, 3000);
};
const someCallback = (val) => console.log(val);
yourXFunction(async1, async2, async3, someCallback);
// через 6 секунд выведет "13"
// так не сработает:
const response = '{"success":1,"data":"{\"esiaId\":null,\"legalMunicipality\":{\"id\":12,\"name\":\"Энгельс\"},\"factMunicipality\":{\"id\":12,\"name\":\"Энгельс\"},\"is_subscribed\":false,\"subscriptions\":null}"}';
// а вот так всё получится:
const response2 = '{"success":1,"data":"{\\\"esiaId\\\":null,\\\"legalMunicipality\\\":{\\\"id\\\":12,\\\"name\\\":\\\"Энгельс\\\"},\\\"factMunicipality\\\":{\\\"id\\\":12,\\\"name\\\":\\\"Энгельс\\\"},\\\"is_subscribed\\\":false,\\\"subscriptions\\\":null}"}';
console.log(response2);
const parsed = JSON.parse(response2);
const data = JSON.parse(parsed.data);
console.log(data.legalMunicipality.name); // Энгельс
const someObject = {a:'value A'};
const arr1 = [1, 'test', someObject];
const arr2 = [100, 200, 'testing', {a:'value A'}];
const arr3 = [1e3, someObject];
const arrays = [arr1, arr2, arr3];
const dict = new Map();
const addArray = (arr, label) => {
for(let i=0, len=arr.length; i<len; i++) {
const key = arr[i];
if (dict.has(key)) return [key, dict.get(key), label];
dict.set(key, label);
}
}
for (let i=0, len = arrays.length; i<len; i++) {
const check = addArray(arrays[i], `arr${i+1}`);
if (!check) continue;
console.log(`Value ${check[0]} found in arrays ${check[1]} and ${check[2]}`);
break;
}
// Value [object Object] found in arrays arr1 and arr3
let
и const
– объявлений с блочной областью видимости – без IIFE можно обходиться там, где их заводили только ради чистоты глобальной о.в.:// раньше
(function(){
var a = 1;
var b = 2;
b *= 2;
console.log(a + b);
})();
// здесь a и b уже не видны
// теперь можно просто заключить часть кода в "блок"
// и все переменные останутся в Вегасе:
{
const a = 1;
let b = 2;
b *= 2;
console.log(a + b);
}
[0, 1)
— квадратная скобка означает включение числа, круглая – «дырку», исключение.x - 0.5
(включая) до x + 0.5
(исключая) округлит до целого x
. Можно записать так: [x-0.5, x+0.5)
min
до max
в описанном варианте старается сгладить вероятности всех целых до равных. Math.random()
. При этом сама "1" не участвует, но в данном случае это маловажно. Далее умножаем да диапазон, напр. на 4, и с помощью Math.round()
делим отрезки этой дорожки в кучки для каждого целого. Кучки по краям получатся меньше остальных.[0, 1)
просто умножить на 4 и округлить Math.round()
– будет выдавать случайные целые [0, 4]
(а не до 3). И как неравновероятно!0 1
[...................)
0 1 2 3 4
00011111222223333344o
Math.round()
разбивает пополам расстояние между двумя целыми, получится не 4 а 5 кучек. При чём в крайние, 0 и 4, попадёт всего по пол-интервала. Их вероятность будет 1/2 от полноценных вероятностей для 1, 2 и 3.min-0.5
до max+0.5
, чтобы после Math.round()
вероятности всех целых были одинаковы.Math.round()
можно недолюбливать и вместо него округлять вниз, Math.floor() – так случайное целое, как в вашем вопросе, можно получить проще const rand = (min, max) => min + Math.floor(Math.random() * (max - min + 1));
alert( rand(1, 3) );
[ .. )
– включающими начало, но исключающими конец. Например, randomInteger(min, max)
никогда бы не вернула max
. А это задание вышло такое себе, нетрадиционное, у них ) const che = new Date(2020, 0, 1);
const now = new Date();
let diff = Math.floor((che - now) / 1000); // в секундах
24 * 60 * 60 = 86400
секунд.const days = Math.floor(diff / 86400);
// вычесть учтённые дни из остатка времени
diff -= days * 86400;
0 – дней – часов
1 – день – час
2 – дня – часа
function declOfNum(number, titles) {
cases = [2, 0, 1, 1, 1, 2];
return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}
// применение:
declOfNum(days, ['день', 'дня', 'дней']); // массив из вариантов для 1, 2, 5
function func_9() {
let k = +prompt('Введите первое число');
let i = +prompt('Введите второе число');
if (k > i) {
while (k > i) {
if (k % 2 == 0) { // это значит, что k четное - выведите 0
k--;
} else { // сюда попадаем если k нечетное, надо его просто вывести
k += + k; // тут ошибка: зачем-то k удваивается: к нему прибавляется оно же. Эта строка не нужна
console.log(k); // ок
}
k--;
console.log(k); // не надо
}
}
else {
// предупредите, что первое число вы ожидаете бОльшим, чем второе. Хотя логичнее просить вводитб первое число меньше, чем второе
alert('arror');
}
}
func_9();
function funk_it_up() {
const a = +prompt('Введите первое число');
const b = +prompt('Введите второе число');
if (a >= b) {
alert('Первое число должно быть меньше второго');
return;
}
for (let i = a + 1; i < b; i++) {
console.log( i & 1 ? i : 0);
}
}
funk_it_up();