const find = (data, test, key) =>
test(key, data)
? data
: data === Object(data)
? Object.entries(data).reduce((found, n) =>
found !== null ? found : find(n[1], test, n[0])
, null)
: null;function find(data, test) {
for (const stack = [ [ , data ] ]; stack.length;) {
const [ k, v ] = stack.pop();
if (test(k, v)) {
return v;
} else if (v instanceof Object) {
stack.push(...Object.entries(v).reverse());
}
}
return null;
}const value = find(вложенный_объект, k => k === 'ключ');
async function test() {
let result = null;
do {
result = await camel() || await new Promise(r => setTimeout(r, 1000));
} while (!result);
return result;
}
const sum = arr.reduceRight((acc, n) => n && acc + n, 0);let sum = 0;
for (let i = 0; arr[i]; sum += arr[i++]) ;let sum = 0;
for (const n of arr) {
if (!n) {
break;
}
sum += n;
}const sum = (function sum(i, n = arr[i]) {
return n ? n + sum(i + 1) : 0;
})(0);
Array одно число, будет создан (будет попытка создания - отрицательные и нецелые числа приведут к ошибке) массив указанной длины. Метод push может принимать несколько значений, а возвращает - новую длину массива, после добавления элементов. Т.е., в массив из трёх элементов добавили ещё четыре, и получили длину.
arr.sort((a, b) => {
return Number.isNaN(+a) || Number.isNaN(+b)
? a.localeCompare(b)
: a - b;
});
// или
arr.sort((a, b) => (a - b) || a.localeCompare(b));const sorted = (arr, keys) => arr
.map(n => [ n ].concat(keys(n)))
.sort((a, b) => {
let diff = 0;
a.find((n, i) => diff = i && ((n < b[i]) ? -1 : +(n > b[i])));
return diff;
})
.map(n => n[0]);
const sortedArr = sorted(arr, n => [ +n, n.toLowerCase() ]);
this - это и будет ссылка на нужный элемент. Конечно, только в том случае, если какое-то другое значение не было заранее привязано к обработчику (как такое может быть - bind и стрелочные функции).target с помощью closest.