arr.sort((a, b) => (a.rooms - b.rooms) || (a.square - b.square));
// или, в более общем виде
const sort = (arr, ...keys) =>
arr.sort((a, b) => {
let diff = 0;
keys.find(k => diff = a[k] - b[k]);
return diff;
});
sort(arr, 'rooms', 'square');
const sorted = (arr, keys) => arr
.map(n => [ n ].concat(keys(n)))
.sort((a, b) => {
let diff = 0;
for (let i = 0; ++i < a.length && !(diff = a[i] - b[i]);) ;
return diff;
})
.map(n => n[0]);
const sortedArr = sorted(arr, n => [ n.rooms, n.square ]);
T extends [], K extends keyof T
- K
тут что-то производное от number
, потому что ключи(keyof) массива([]) - только цифры.let resultSort: T = arr;
- бессмысленно, так как arr.sort
в любом случае меняет исходный массив.a[propertyName].toLowerCase()
- упадёт если propertyName
будет year
, т.к. Number не имеет метода toLowerCase
.function sortArray<T extends {[key: string]: unknown}, K extends keyof T> (originArr: T[], propertyName: K, cb: (a: T[]) => T[]): T[] {
let arr: T[] = JSON.parse(JSON.stringify(originArr)); //deep copy array
arr.sort((a, b) => {
let nameA = String(a[propertyName]).toLowerCase(),
nameB = String(b[propertyName]).toLowerCase();
if (nameA < nameB)
return -1;
if (nameA > nameB)
return 1;
return 0;
});
return cb(arr);
}
String
, но тогда вместо unknown
надо указать конкретные типы с которыми предполагается работать, и в самой функции сортировки их учесть. switch (true) {
case one.includes(inp):
...
break;
case two.includes(inp):
...
break;
}
const arr = [
{
values: [ ... ],
action: () => { ... },
},
{
values: [ ... ],
action: () => { ... },
},
];
arr.find(n => n.values.includes(inp))?.action();
sayHello
и getAge
до тех пор, пока наш пользователь не даст ответ:const promt = (message = '') => window.prompt(message);
function sayHello() {
let name = promt('Здравствуйте, как вас зовут?');
return name || sayHello();
}
function getAge() {
let age = promt('Сколько вам лет?');
return age || getAge();
}
function greeting() {
let name = sayHello();
let age = getAge();
alert(`Здравствуйте ${name}, вам ${age} лет.`);
}
greeting();
const promt = (message = '') => window.prompt(message);
function getAnswerAnyway(defaultQuestion, repeatQuestion) {
const iter = (atempts = 2) => {
const question = atempts === 2 ? defaultQuestion : repeatQuestion;
let age = promt(question);
return age || iter(atempts - 1);
}
return iter(2);
}
function greeting() {
let name = getAnswerAnyway(
'Здравствуйте, как вас зовут?',
'Я же спрашиваю, как вас зовут?',
);
let age = getAnswerAnyway(
'Сколько вам лет?',
'Почему молчите? Возраст укажите',
);
alert(`Здравствуйте ${name}, вам ${age} лет.`);
}
greeting();
const keys = [
[
{ on: [ 'ё', 'Ё' ], off: [ '`', '~' ], name: 'Backquote' },
{ on: [ '1', '!' ], off: [ '1', '!' ], name: 'Digit1' },
...
],
...
];
document.querySelector('.keyboard').innerHTML = keys.map(row => `
<div class="row">${row.map(n => `
<div class="key">
<span class="${n.name} on">
<span class="case down">${n.on[0]}</span>
<span class="case up">${n.on[1]}</span>
</span>
<span class="${n.name} off">
<span class="case down">${n.off[0]}</span>
<span class="case up">${n.off[1]}</span>
</span>
</div>`).join('')}
</div>`).join('');
async getAll(req, res) {
try {
const { rows, rowCount } = await db.query(query)
return res.status(200).send({ rows, rowCount })
} catch (error) {
return res.status(400).send(error)
}
}
Не понятно почему эта херня будет выполняться параллельно
const await1 = await pause500ms(); // ожидаем 500мс разрешение промиса и получаем undefined
const await2 = await pause500ms(); // ожидаем 500мс разрешение промиса и получаем undefined
await await1; // передаем undefined и получаем разрешенный промис
await await2; // передаем undefined и получаем разрешенный промис
console.log("I will be logged after 500ms"); // No, you will be logged after 1000ms
await await1;
и await await2;
на первый взгляд не оказывают влияния на код, но это не так.(async() => {
await console.log(1);
await console.log(2);
console.log(3);
})();
console.log(4);
(async() => {
await console.log(5);
console.log(6);
})();
console.log(7);
// 1
// 4
// 5
// 7
// 2
// 6
// 3
Какой промис возвращает функция - разрешенный или нет?
function pause500ms() {
return new Promise(function(resolve) {
setTimeout(function() {
resolve(); // вот тут разрешается созданный Promise
}, 500);
});
}
В константу await1 записывается функция(?) или результат ее исполнения, а именно промис?
А здесь, получается, функция вызывается?
await await1;
await await2;
console.log("I will be logged after 500ms");
Promise.resolve(undefined).then(() => {
Promise.resolve(undefined).then(() => {
console.log("I will be logged after 500ms");
});
});
Что значит возвращает промис?
// Что значит промис. Промис, это спецобъект, содержащий свое состояние и инструкции, которые необходимо исполнить после достижения того или иного состояния. Так? Так.