const replaceKeys = (val, replacer) =>
val instanceof Array
? val.map(n => replaceKeys(n, replacer))
: val instanceof Object
? Object.fromEntries(Object
.entries(val)
.map(n => [ replacer(n[0]), replaceKeys(n[1], replacer) ])
)
: val;
const newObj = replaceKeys(obj, k => k.toUpperCase());
`${str | 0}`
// или
str.replace(/^0+/, '')
// или
str.match(/[^0].*/)[0]
// или
str.split(/^0*/).pop()
// или
str.slice(str.search(/[^0]/))
// или
[...str].reduce((acc, n) => (+n || acc) && acc + n, '')
$('#search-faq-input-filter').on('input', e => {
const val = $(e.target).val().toLowerCase();
$('.ia-item')
.hide()
.filter((i, n) => (
$('.ia-content', n).text().toLowerCase().includes(val) ||
$('.ia-title-link', n).text().toLowerCase().includes(val)
))
.show();
});
[...new Set(data.variations.map(n => n.color.name))]
Object.values(Object.fromEntries(data.variations.map(n => [ n.color.name, n.color ])))
// или
Object.values(data.variations.reduce((acc, { color: n }) => (acc[n.name] ??= n, acc), {}))
// или
data.variations.map(n => n.color).filter(function(n) {
return !(this[n.name] = this.hasOwnProperty(n.name));
}, {})
const unique = (data, key = n => n) =>
Array.prototype.filter.call(data, function(n) {
const k = key(n);
return !this.has(k) && this.add(k);
}, new Set);
// получаем массив уникальных имён цветов
const uniqueStrColors = unique(data.variations.map(n => n.color.name));
// получаем массив объектов цветов, свойства name которых уникальны
const uniqueObjColors = unique(data.variations.map(n => n.color), n => n.name);
document.querySelectorAll('.slider__itm img').forEach(n => {
const link = document.createElement('a');
n.parentNode.append(link);
link.append(n);
});
for (const n of document.querySelectorAll('.slider__itm')) {
n.innerHTML = `<a>${n.innerHTML}</a>`;
}
for (const n of document.getElementsByClassName('slider__itm')) {
const link = document.createElement('a');
link.appendChild(n.replaceChild(link, n.children[0]));
}
const imgs = document.querySelectorAll('.slider__itm img');
for (let i = 0; i < imgs.length; i++) {
const link = document.createElement('a');
imgs[i].replaceWith(link);
link.insertAdjacentElement('afterbegin', imgs[i]);
}
select.addEventListener('change', function() {
swiper.slideTo(this.selectedIndex);
});
const filteredPeople = people.filter(n => n.name.includes(searchFilter));
<ul className="list-group">
{filteredPeople.map(n => (
...
{ точка: сегмент }
). Находим начальный сегмент маршрута - такой, начальная точка которого не является ничьей конечной. Следующий сегмент маршрута - такой, начальная точка которого является конечной точкой текущего сегмента. Ну и крутим цикл до тех пор, пока текущий сегмент маршрута существует, не забывая сохранять его в результирующий массив:function sort(route) {
const pointsFrom = Object.fromEntries(route.map(n => [ n.from, n ]));
const pointsTo = Object.fromEntries(route.map(n => [ n.to, n ]));
const sorted = [];
for (
let segment = route.find(n => !pointsTo[n.from]);
segment;
segment = pointsFrom[segment.to]
) {
sorted.push(segment);
}
return sorted;
}
const remove = str => str.split(' ').slice(0, -1).join(' ');
// или
const remove = str => str.replace(/\s\S+$/, '');
// или
const remove = str => str.match(/.+(?=\s)/);
// или
const remove = str => str.slice(0, str.lastIndexOf(' '));
for (const n of document.getElementsByClassName('startdate')) {
n.textContent = remove(n.textContent);
}
// или, раз уж полной даты уже не будет, пусть начало и конец интервала дат
// располагаются внутри одного элемента - вместе с куском строки также
// удаляем и родительский элемент
document.querySelectorAll('.startdate').forEach(n => {
n.outerHTML = remove(n.innerHTML);
// или
n.replaceWith(remove(n.innerText));
});
map
, filter
, some
и т.д.), принимающую элемент массива и возвращающую true
в случае, если элемент должен быть удалён. Если элемент удалять не надо, то следует обработать массив вложенных элементов - выполняется рекурсивный вызов. Как это может выглядеть:function deleteNested(arr, fn) {
arr?.reduceRight?.((_, n, i, a) =>
fn(n, i, a)
? a.splice(i, 1)
: deleteNested(n.children, fn)
, null);
}
function deleteNested(arr, fn) {
if (Array.isArray(arr)) {
arr.splice(0, arr.length, ...arr.filter((n, i, a) => {
return !fn(n, i, a) && (deleteNested(n.children, fn), true);
}));
}
}
function deleteNested(arr, fn) {
if (arr instanceof Array) {
let numDeleted = 0;
for (const [ i, n ] of arr.entries()) {
if (fn(n, i, arr)) {
numDeleted++;
} else {
arr[i - numDeleted] = n;
deleteNested(n.children, fn);
}
}
arr.length -= numDeleted;
}
}
deleteNested(itemsData, n => n.id === id_объекта_который_надо_удалить);
document.querySelector('.calendar-days').addEventListener('click', e => {
if (e.target.classList.contains('calendar-day-hover')) {
currDate = new Date(curr_year.value, curr_month.value, e.target.innerText);
document.querySelector('.heading').innerText = currDate.toLocaleDateString('ru-RU');
e.currentTarget.querySelector('.curr-date')?.classList.remove('curr-date');
e.target.classList.add('curr-date');
}
});
def nested_to_plain(obj):
result = {}
for key, val in obj.items():
if type(val) == dict:
result.update({ key + '.' + k: v for k, v in nested_to_plain(val).items() })
else:
result[key] = val
return result
const point = { latitude: lat, longtitude: lon };
const closest = arr.reduce((closest, n) => {
const d = sphericalDistance(point, n);
return d < closest[1] ? [ n, d ] : closest;
}, [ null, Infinity ])[0];
function sphericalDistance(p1, p2) {
// https://en.wikipedia.org/wiki/Great-circle_distance
}
const SHOW_INITIAL = 2;
const SHOW_MORE = 3;
const $button = $('.btn-search-more');
const $items = $('.catalog-list__items-top').hide();
showItems(SHOW_INITIAL);
$button.click(() => showItems(SHOW_MORE));
function showItems(count) {
const $hidden = $items.filter(':hidden');
$hidden.slice(0, count).show();
$button.toggle($hidden.length > count);
}