arr1.filter(n => arr2.includes(n)).length !== 0
// или
arr1.some(Set.prototype.has.bind(new Set(arr2)))
// или
new Set(arr1).size + new Set(arr2).size > new Set([ ...arr1, ...arr2 ]).size
function intersection(data1, data2, key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const keys = new Set(Array.from(data2, getKey));
const result = [];
for (const n of data1) {
if (keys.has(getKey(n))) {
result.push(n);
}
}
return result;
}
// как применять в вашем случае
!!intersection(arr1, arr2).length
// другие примеры использования
intersection(Array(5).keys(), Array(3).keys()) // [0, 1, 2]
intersection('abcDe', 'cd', n => n.toLowerCase()) // ['c', 'D']
intersection([{id: 1}, {id: 2}, {id: 3}], [{id: 2}, {id: 4}], 'id') // [{id: 2}]
methods: {
selectDaysRange(days) {
this.selected = [
moment(this.now).subtract(days, 'days').format('YYYY-MM-DD'),
this.startDate,
];
},
},
value=""
. Соответственно, проверять надо будет value на пустоту, а не равенство тексту. Это и проще, и код не придётся переписывать, если вдруг завтра вам потребуется изменить текст по умолчанию..element
), а не каждому элементу индивидуально. Не придётся вписывать новый обработчик или удалять существующий, если изменится количество элементов в форме.button.disabled = ![
inputMail.value,
inputPhone.value,
select.value,
checkbox.checked,
].every(Boolean);
str.match(/(?<=\{{2}).*?(?=\}{2})/g) ?? []
// или
Array.from(str.matchAll(/\{\{(.*?)\}\}/g), n => n[1])
Читаю документацию, не могу найти
<vue-slick ref="slider">
...
</vue-slick>
<button @click="$refs.slider.goTo(4)">перейти к четвёртому слайду</button>
<button @click="$refs.slider.goTo(7, true)">перейти к седьмому слайду, без анимации</button>
const className = 'cart__counter';
.const remove = el => el.innerText = parseInt(el.innerText);
// или
const remove = el => el.innerHTML = el.innerHTML.match(/\d+/)[0];
// или
const remove = el => el.textContent = el.textContent.replace(/\D/g, '');
// или
const remove = el => [ el.firstChild.data ] = el.firstChild.data.split(' ');
// или
const remove = el => el.childNodes[0].nodeValue = parseFloat(el.childNodes[0].nodeValue);
document.querySelectorAll(`.${className}`).forEach(remove);
// или
for (const n of document.getElementsByClassName(className)) {
remove(n);
}
const arr = Object
.entries(obj)
.sort((a, b) => b[1] - a[1])
.map(n => n[0]);
const arr = Object
.values(Object.entries(obj).reduce((acc, n) => ((acc[n[1]] ??= []).push(n[0]), acc), {}))
.reverse()
.flat();
[...params.keys()].forEach(n => whiteList.includes(n) || params.delete(n));
childNodes
, который представляет собой динамический NodeList
и одновременно пытаетесь его модифицировать. Удаляя один узел, вы пропускаете следующий - т.е., если несколько текстовых узлов идут подряд, то удалён будет только каждый второй; а те нетекстовые узлы, которые расположены после текстовых, тут никакой рекурсии не случится, их содержимое вообще никак не будет обработано. Надо делать копию childNodes
, и перебирать её. Или вместо for...of
использовать цикл со счётчиком, при удалении узла счётчик увеличиваться не должен. Или перебирать childNodes
от конца к началу - тоже цикл со счётчиком или reduceRight
(да, это будет использование метода не совсем по назначению).nextElementSibling
, не знаю, как это комментировать. Надо было просто вызвать функцию, передав ей текущий элемент.const deleteTextNodes = node =>
node.nodeType === Node.TEXT_NODE
? node.remove()
: [...node.childNodes].forEach(deleteTextNodes);
// или
function deleteTextNodes(node) {
if (node instanceof Text) {
node.remove();
} else {
Array.prototype.reduceRight.call(node.childNodes, (_, n) => deleteTextNodes(n), null);
}
}
const Button = ({ children, className = '', ...rest }) => (
<button {...rest} className={`button ${className}`}>
{children}
</button>
);
if (total_sum >= rand) {
function getRandom(arr, key) {
const rand = Math.random() * arr.reduce((acc, n) => acc + n[key], 0);
let sum = 0;
return arr.find(n => (sum += n[key]) > rand);
}
const obj = getRandom(data, 'weight');
document.addEventListener('click', ({ target: t }) => {
if (t.matches('.oldValue')) {
let input = t;
while (!(input = input.previousElementSibling).matches('.value')) ;
input.value = t.textContent;
}
});
const inputs = document.querySelectorAll('.value');
const spans = [...document.querySelectorAll('.oldValue')];
const onClick = ({ target: t }) => inputs[spans.indexOf(t)].value = t.innerText;
spans.forEach(n => n.addEventListener('click', onClick));
document.addEventListener('click', ({ target: t }) => {
if (t.classList.contains('oldValue')) {
t.closest('селектор общей обёртки').querySelector('.value').value = t.innerHTML;
}
});