<a>. Соответственно, не будет и атрибута href. А у null не будет метода substr. О чём вы должны были узнать сами, из сообщения об ошибке - если бы открыли консоль.target следует использовать currentTarget.target к <a>, если таковой нашёлся, получать его href, начинается с решётки - выполнять плавную прокрутку к соответствующему элементу:document.addEventListener('click', e => {
const href = e.target.closest('a')?.getAttribute('href') ?? '';
if (href[0] === '#') {
e.preventDefault();
document.querySelector(href)?.scrollIntoView({
behavior: 'smooth',
});
}
});
const newUrl = url.match(/.+\//)[0];
// или
const newUrl = url.replace(/[^\/]+$/, '');
// или
const newUrl = url.slice(0, url.lastIndexOf('/') + 1);
// или
const newUrl = url.split(/(\/)/).slice(0, -1).join('');preg_match('/.+\//', $url, $match);
$newUrl = $match[0];
// или
$newUrl = preg_replace('/[^\/]+$/', '', $url);
// или
$newUrl = substr($url, 0, strrpos($url, '/') + 1);
// или
$newUrl = implode('', array_slice(preg_split('/(\/)/', $url, 0, PREG_SPLIT_DELIM_CAPTURE), 0, -1));
const where = '.list';
const what = '.content';const $targets = $(where).children();
$(what).each((i, n) => $targets.eq(i).append(n));const targets = document.querySelector(where).children;
document.querySelectorAll(what).forEach((n, i) => targets[i]?.append(n));
Object.values(data).flat().find(n => n.title === search)Object.fromEntries(Object
.entries(data)
.map(n => [ n[0], n[1].filter(m => m.title.toLowerCase().includes(search.toLowerCase())) ])
.filter(n => n[1].length)
)
const result = Object.values(cars.reduce((acc, n) => (
(acc[n.make] ??= { make: n.make, attr: [] }).attr.push(n),
acc
), {}));function group(data, key, val = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const getVal = val instanceof Function ? val : n => n[val];
const result = new Map;
for (const n of data) {
const k = getKey(n);
result.set(k, result.get(k) ?? []).get(k).push(getVal(n));
}
return result;
}const result = Array.from(
group(cars, 'make'),
([ make, attr ]) => ({ make, attr })
);
setData(result);setData({ ...result });.
str.slice(1, -1).split(', ')
// или
JSON.parse(str.replace(/[а-яё]+/g, '"$&"'))
// или
str.match(/[^\s\[\],]+/g) ?? []
coord.split(', ').map(Number)
// или
coord.match(/[\d.]+/g).map(n => +n)
// или
eval(`[${coord}]`)
// или
JSON.parse('['.concat(coord, ']'))
// или
Array.from(coord.matchAll(/[^, ]+/g), parseFloat)
const result = [...subcategory.reduce(
(acc, n) => (acc.get(n.category)?.children.push(n), acc),
new Map(category.map(n => [ n.id, { ...n, children: [] } ]))
).values()];const result = category.map(n => ({
...n,
children: subcategory.filter(m => m.category === n.id),
}));const result = category.map(function(n) {
return {
...n,
children: this[n.id] ?? [],
};
}, subcategory.reduce((acc, n) => ((acc[n.category] ??= []).push(n), acc), {}));
$('.item').on('mouseover', '.dot', function({ delegateTarget: t }) {
$('.thumb-target', t).attr('src', $(this).data('img'));
$('.dot', t).removeClass('select').filter(this).addClass('select');
});document.querySelectorAll('.item').forEach(n => {
n.addEventListener('mouseover', onMouseOver);
});
function onMouseOver({ target: t, currentTarget: ct }) {
const dot = t.closest('.dot');
if (dot) {
ct.querySelector('.thumb-target').src = dot.dataset.img;
ct.querySelectorAll('.dot').forEach(n => {
n.classList.toggle('select', n === dot);
});
}
}
.frame { на .slider /deep/ .frame {.mounted() { for (let i = 0; i < 3; i++) { let frame = document.createElement("div"); frame.classList.add("frame"); //класс присваивается но стили не применяются this.$refs.slider.appendChild(frame); } },
const sum = (...arr) => arr
.flatMap(Object.entries)
.reduce((acc, [ k, v ]) => (
acc[k] = (acc[k] ?? 0) + v,
acc
), {});function sum() {
const result = {};
for (const n of arguments) {
for (const k in n) {
if (n.hasOwnProperty(k)) {
if (!result.hasOwnProperty(k)) {
result[k] = 0;
}
result[k] += n[k];
}
}
}
return result;
}const obj = sum(obj1, obj2);.
Визуал jsx элемента, как и вопросы форматирования времени и даты не так важны, как важно просто разобраться с возможной последовательностью действий, как все это описать.
arr.map(n => {
const start = форматированное значение n.start_at;
const end = форматированное значение n.end_at;
return <span>{start} - {end}</span>;
})