const delay = timeout => new Promise(r => setTimeout(r, timeout));
async function asyncDelayedForEach(arr, callback, timeout) {
for (let i = 0; i < arr.length; i++) {
await callback.call(arr, arr[i], i, arr);
await delay(timeout);
}
}
// или
const asyncDelayedForEach = (arr, callback, timeout) =>
arr.reduce((acc, n, i, a) => acc
.then(() => callback.call(a, n, i, a))
.then(() => delay(timeout))
, Promise.resolve());
Object.values(arr.reduce((acc, [ user, ...data ]) => {
(acc[user] = acc[user] ?? { user, data: [] }).data.push(data);
return acc;
}, {}))
document.querySelector('.todo-app__list').addEventListener('click', e => {
const li = e.target.closest('.todo-app__list-item');
if (li) {
console.log(li.dataset.id);
}
});
const result = arr1.filter(function(n) {
return this.some(m => m.every(([ k, v ]) => v === n[k]));
}, arr2.map(Object.entries));
undefined
, вместо которого с помощью nullish coalescing подставляем просто цену. А чтобы не копипастить извлечение цены, вынесем его в отдельную функцию, которую, как и сам сортируемый массив, можно сделать параметром функции сортировки.const sorted = (arr, key) => arr
.map(n => [ n, key(n) ])
.sort((a, b) => a[1] - b[1])
.map(n => n[0]);
const sortedArr = sorted(arr, n => -(n.price.new ?? n.price).replace(/\D/g, ''));
const uniqueObj = (obj, key = val => val) =>
Object.fromEntries(Object
.entries(obj)
.filter(function(n) {
const k = key(n[1], n[0]);
return !this.has(k) && this.add(k);
}, new Set)
);
const getMaxIndexes = (arr, count) => Object
.entries(arr.reduce((acc, n, i) => ((acc[n] = acc[n] ?? []).push(i), acc), {}))
.sort((a, b) => b[0] - a[0])
.flatMap(n => n[1])
.slice(0, count);
$slider.find('.ul-slider-handle').html(`<img src="${imageSrc}">`);
slide(e, ui) {
$(this).find('.ui-slider-handle img').css('opacity', в зависимости от ui.value);
},
<div data-color="black"></div>
<div data-color="white"></div>
document.addEventListener('click', ({ target: { dataset: { color } } }) => {
if (color) {
document.querySelector('button').dataset.id = color;
}
});
// или
const button = document.querySelector('button');
const onClick = e => button.setAttribute('data-id', e.target.getAttribute('data-color'));
document.querySelectorAll('[data-color]').forEach(n => n.addEventListener('click', onClick));
$('.btn-show').on('click', function() { $(this).toggleClass('.flip'); });
'flip'
, без точки..btn-show
- вот там и дёргайте toggleClass. const arr = Array.from({ length: max - min + 1 }, (n, i) => i + min);
function* range(start, stop, step) {
if (stop === undefined) {
stop = start;
start = 0;
}
if (start === stop) {
step = 1;
}
if (step === undefined) {
step = Math.sign(stop - start);
}
if (start <= stop && step > 0 || start >= stop && step < 0) {
for (let i = start; step < 0 ? i >= stop : i <= stop; i += step) {
yield i;
}
}
}
console.log(Array.from(range(3, 9))); // [3, 4, 5, 6, 7, 8, 9]
console.log([...range(-5)]); // [0, -1, -2, -3, -4, -5]
for (const n of range(100, 200, 33)) {
console.log(n); // 100 133 166 199
}
const r = range(12, -7, -5);
for (let n; !(n = r.next()).done; ) {
console.log(n.value); // 12 7 2 -3
}
const replacements = {
worksAmount: 187,
reviewsAmount: 666,
};
const newStr = str.replace(/\$\$\[(\w+)\]/g, (m, g1) => replacements[g1] ?? m);
async function chain(arr) {
const result = [];
for (const item of arr) {
result.push(await item(result[result.length - 1]));
}
return result;
}
function chain(arr) {
const result = [];
return arr
.reduce((prev, curr) => prev.then(curr).then(r => (result.push(r), r)), Promise.resolve())
.then(() => result);
}
const find = (arr, id) =>
(Array.isArray(arr) ? arr : []).reduce((found, n) =>
found ?? (n.id === id ? n : find(n.children, id))
, null);
const obj = find(arr, id);
if (obj) {
obj.isSelected = isSelected;
}