map.panTo(...).then(() => map.setZoom(...))
$('.search').on('input', function() {
const search = $(this).val().trim().toLowerCase();
$('.metro-line__item')
.hide()
.filter((i, n) => $('.metro__name', n).text().toLowerCase().includes(search))
.show();
$('.metro-line')
.show()
.not(':has(.metro-line__item:visible)')
.hide();
});
.hidden {
display: none;
}
document.querySelector('.search').addEventListener('input', e => {
const search = e.target.value.trim().toLowerCase();
document.querySelectorAll('.metro-line__item').forEach(n => {
const name = n.querySelector('.metro__name').textContent.toLowerCase();
n.classList.toggle('hidden', !name.includes(search));
});
document.querySelectorAll('.metro-line').forEach(n => {
n.classList.toggle('hidden', !n.querySelector('.metro-line__item:not(.hidden)'));
});
});
const className = 'класс, который не надо удалять';
// Если известно, что класс присутствует или должен быть добавлен в случае отсутствия:
element.className = className;
// Если известно, что класс отсутствует и не должен быть добавлен:
element.className = '';
// Если неизвестно, присутствует ли класс и в случае отсутствия он не должен быть добавлен:
element.className = element.classList.contains(className) ? className : '';
// или
element.classList.remove(...[...element.classList].filter(n => n !== className));
computed: {
fullData() {
return this.posts.map(post => ({
post,
user: this.users.find(user => user.id === post.userId) ?? {},
}));
},
},
<div v-for="n in fullData">
<div>{{ n.post.title }}</div>
<div>{{ n.user.name }}</div>
<div>{{ n.post.body }}</div>
</div>
<input type="checkbox" v-model="sort">
<div v-for="dog in sortedDogs">
data: () => ({
sort: false,
}),
computed: {
sortedDogs() {
return this.sort
? [...this.allDogs].sort((a, b) => a.breeds[0].name.localeCompare(b.breeds[0].name))
: this.allDogs;
},
},
function createTree(arr, structure) {
const tree = Object.fromEntries(arr.map(n => [ n.id, { ...n } ]));
const nonRootIds = structure.flatMap(n => n.children);
structure.forEach(n => tree[n.id].elements = n.children.map(m => tree[m]));
return Object.values(tree).filter(n => !nonRootIds.includes(n.id));
}
v-model
+ watch
:<input v-model="text">
watch: {
text(newVal, oldVal) {
console.log(newVal, oldVal);
},
},
str.replace(/(\d)\1+/g, '$1')
// или
''.concat(...str.split(/(\d)\1+/))
// или
Array.from(str).filter((n, i, a) => Number.isNaN(+n) || a[i - 1] !== n).join('')
// или
[...str.matchAll(/(\D+)|(?:(\d)\2*)/g)].reduce((acc, n) => acc + (n[1] ?? n[2]), '')
const checkItem = item => item.status === 'выполнено';
arr.sort((a, b) => +checkItem(a) || -checkItem(b));
// или
arr.reduceRight((_, n, i, a) => checkItem(n) && a.push(a.splice(i, 1)[0]), null);
// или
arr
.reduce((acc, n, i) => (
arr[i - acc.length] = n,
checkItem(n) && acc.push(n),
acc
), [])
.forEach((n, i, a) => arr[arr.length - a.length + i] = n);
const newArr = arr
.reduce((acc, n) => (
acc[+checkItem(n)].push(n),
acc
), [ [], [] ])
.flat();
// или
const newArr = arr.reduce((acc, n) => (
acc[checkItem(n) ? 'push' : 'unshift'](n),
acc
), []);
// или
const newArr = [
...arr.filter(n => !checkItem(n)),
...arr.filter(checkItem),
];
.card.show .text {
display: block;
}
const containerSelector = '.card';
const buttonSelector = 'button';
const activeClass = 'show';
document.addEventListener('click', e => {
const button = e.target.closest(buttonSelector);
const container = button && button.closest(containerSelector);
container && container.classList.toggle(activeClass);
});
// или
document
.querySelectorAll(`${containerSelector} ${buttonSelector}`)
.forEach(n => n.addEventListener('click', onClick));
function onClick() {
this.closest(containerSelector).classList.toggle(activeClass);
}
const ids = [ 9, 10 ];
const items = arr.flatMap(n => n.items);
// или
const items = Array.prototype.concat.apply([], arr.map(n => n.items));
// или
const items = arr.reduce((acc, n) => (acc.push(...n.items), acc), []);
const result = items.filter(n => ids.includes(n.id));
// или
const result = items.filter(function(n) {
return this.has(n.id);
}, new Set(ids));
// или
const itemsObj = Object.fromEntries(items.map(n => [ n.id, n ]));
const result = ids.reduce((acc, n) => ((n = itemsObj[n]) && acc.push(n), acc), []);
<button data-step="+1">PREV</button>
<button data-step="-1">NEXT</button>
const sliderSelector = '.slider';
const blockSelector = '.block';
const buttonDataAttr = 'step';
const buttonSelector = `[data-${buttonDataAttr}]`;
const activeClass = 'active';
const getActiveBlockIndex = () => ((-pos % len) + len) % len;
const getSliderRotation = () => 'rotate(' + pos * 360 / len + 'deg)';
let pos = 0;
const $slider = $(sliderSelector);
const $blocks = $slider.find(blockSelector);
const len = $blocks.length;
$(buttonSelector).click(function() {
$blocks.eq(getActiveBlockIndex()).removeClass(activeClass);
pos += parseInt($(this).data(buttonDataAttr));
$slider.css('transform', getSliderRotation());
$blocks.eq(getActiveBlockIndex()).addClass(activeClass);
});
const slider = document.querySelector(sliderSelector);
const blocks = slider.querySelectorAll(blockSelector);
const len = blocks.length;
document.querySelectorAll(buttonSelector).forEach(function(n) {
n.addEventListener('click', this);
}, function() {
blocks[getActiveBlockIndex()].classList.remove(activeClass);
pos += +this.dataset[buttonDataAttr];
slider.style.transform = getSliderRotation();
blocks[getActiveBlockIndex()].classList.add(activeClass);
});
.search('\\(')
. Или один, если замените строку на литерал регулярного выражения: .search(/\(/)
. const selector = '.test_wr .test_block';
const propName = 'top';
const getVal = i => `${i * 100}px`;
$(selector).css(propName, getVal);
// или
document.querySelectorAll(selector).forEach((n, i) => {
n.style[propName] = getVal(i);
});
Cannot read property 'concat' of null
В чем ошибка и как в итоге их объединить?
computed: {
fullArray() {
const { users, info } = this;
return user && info
? здесь объединяете данные массивов
: [];
},
},