Как наиболее короче сделать...
generalDiv.innerHTML = newCats
.filter(n => n?.breeds.length)
.map(({ url, breeds: [ b ] }) => `
<div class="cat__item">
<div class="cat__img"><img src="${url}" alt="${b.name}"></div>
<div class="cat__name">${b.name}</div>
<div class="cat__temperament">${b.temperament}</div>
<div class="cat__live">${b.life_span}</div>
<div class="cat__origin">${b.origin}</div>
<div class="cat__description">${b.description}</div>
<div class="cat__wikipedia_url">${b.wikipedia_url}</div>
</div>
`)
.join('');
document.querySelector('form').addEventListener('input', function() {
const sum = Array.prototype.reduce.call(
this.querySelectorAll('input:checked'),
(acc, n) => acc + +n.value,
0
);
document.querySelector('#pSumma').innerText = `$${sum.toFixed(2)}`;
});
document.querySelectorAll('.g-project__words-moving').forEach(n => {
const html = n.querySelector('.words-moving__calm span').outerHTML.repeat(10);
n.querySelectorAll('.running-string-wrapp').forEach(m => m.innerHTML = html);
});
.words-moving__calm span
, вместо того, чтобы ограничиться только теми, которые лежат внутри текущего элемента .g-project__words-moving
. Для исправления можно перенести объявление place
в начало тела внешнего цикла, заменив при этом document
на boxes[i]
. Array.prototype.push.apply(
arr,
newArr.filter(n => !arr.some(m => m.id === n.id))
);
arr.splice(0, arr.length, ...arr
.concat(newArr)
.reduce((acc, n) => acc.set(n.id, acc.get(n.id) ?? n), new Map)
.values()
);
newArr.forEach(function(n) {
this.has(n.id) || (arr[arr.length] = n);
}, new Set(arr.map(n => n.id)));
const SHOW_MORE = 3;
const itemSelector = '.item';
const hiddenClass = 'd-none';
const hiddenSelector = `.${hiddenClass}`;
const $show = $('.show');
const $hide = $('.hide');
const $items = $(itemSelector);
function updateButtons() {
$show.toggleClass(hiddenClass, $items.filter(hiddenSelector).length === 0);
$hide.toggleClass(hiddenClass, $items.not(hiddenSelector).length === SHOW_MORE);
}
$show.click(function() {
$items.filter(hiddenSelector).slice(0, SHOW_MORE).removeClass(hiddenClass);
updateButtons();
}).click();
$hide.click(function() {
$items.slice(SHOW_MORE).addClass(hiddenClass);
updateButtons();
});
Object
.entries({ defaultTest, systemTest })
.flatMap(([ k, { references, ...n } ]) => references.map(m => ({
...m,
...n,
[k]: true,
})))
Object
.entries({ defaultTest, systemTest })
.map(([ k, v ]) => v.map(({ references, ...n }) => references.map(m => ({
...m,
...n,
[k]: true,
}))))
.flat(2)
const setOptions = (el, options, placeholder) =>
el.innerHTML =
`<option hidden selected value="">${placeholder}</option>` +
options.map(n => `<option>${n}</option>`).join('');
<select id="event"></select>
<select id="dates"></select>
const events = [
{ name: '...', dates: [ ... ] },
{ name: '...', dates: [ ... ] },
...
];
const eventEl = document.querySelector('#event');
const datesEl = document.querySelector('#dates');
eventEl.innerHTML = events
.map((n, i) => `<option value="${i}">${n.name}</option>`)
.join('');
eventEl.addEventListener('change', function() {
datesEl.innerHTML = events[this.value].dates
.map(n => `<option>${n}</option>`)
.join('');
});
eventEl.dispatchEvent(new Event('change'));
const getDuplicates = (arr, key) => Array
.from(arr.reduce((acc, { [key]: n }) => acc.set(n, -~acc.get(n)), new Map))
.filter(n => n[1] > 1)
.map(n => n[0]);
const duplicates = getDuplicates(arr, 1);
const getDuplicates = (arr, key = n => n) => Array
.from(arr.reduce((acc, n) => (n = key(n), acc.set(n, acc.has(n))), new Map))
.reduce((acc, n) => (n[1] && acc.push(n[0]), acc), []);
const duplicates = getDuplicates(arr, n => n[1]);
const getDuplicates = arr =>
[...arr.reduce((acc, n) => (
acc[+acc[0].has(n)].add(n),
acc
), [ new Set, new Set ])[1]];
const duplicates = getDuplicates(arr.map(n => n[1]));
Не поможет ли lodash?
const duplicates = _(arr)
.map(n => n[1])
.groupBy()
.filter(n => n.length > 1)
.map(n => n[0])
.value();
async function processData(data) {
const result = [];
for (const { id, k } of data) {
result.push(k ? await api.getData(id) : id);
}
return result;
}
function processData(data) {
return Promise.all(data.map(({ id, k }) => k ? api.getData(id) : id));
}
function render(message) {
const p = document.createElement('p');
p.textContent = message;
windowChatUser1.append(p);
windowChatUser2.append(p.cloneNode(true));
}
function render(message) {
const html = `<p>${message}</p>`;
windowChatUser1.insertAdjacentHTML('beforeend', html);
windowChatUser2.insertAdjacentHTML('beforeend', html);
}