metricsColumn: true
.computed: {
metricsColumns() {
return this.headers.filter(n => n.metricsColumn);
},
},
<template
v-for="(n, i) in metricsColumns"
#[`item.${n.value}`]="{ item: { metrics: { [i]: item } } }"
>
<v-chip
:color="colors[item.metricsValueMarkName]"
:key="n.value"
dark
>
{{ item.metricsValue }}
</v-chip>
</template>
function output(value) {
const digits = document.querySelectorAll('селектор span`ов');
const { length } = digits;
Array
.from(`${value}`.padStart(length, 0).slice(-length))
.forEach((n, i) => digits[i].innerText = n);
}
function output(value) {
document.querySelector('селектор родительского элемента span`ов').innerHTML = Array
.from(`${value}`, n => `<span>${n}</span>`)
.join('');
}
const [ first, ...rest ] = document.querySelectorAll('[type="checkbox"]');
const onChange = () => first.checked = rest.every(n => n.checked);
first.addEventListener('change', () => rest.forEach(n => n.checked = first.checked));
rest.forEach(n => n.addEventListener('change', onChange));
img
:const { images } = new DOMParser().parseFromString(html, 'text/html');
// или
const images = document
.createRange()
.createContextualFragment(html)
.querySelectorAll('img');
// или
const images =
(el => (el.innerHTML = html, el.getElementsByTagName('img')))
(document.createElement('div'));
img
извлечь значения src
и srcset
:const getSrc = img => [ img.src, img.srcset ];
// или
const getSrc = img => [ 'src', 'srcset' ].map(n => img.getAttribute(n));
// или
const getSrc = ({ attributes: a }) => [ a.src.value, a.srcset.value ];
const result = Array.from(images, getSrc);
// или
const result = Array.prototype.map.call(images, getSrc);
// или
const result = [];
for (const n of images) {
result.push(getSrc(n));
}
// или
const result = [];
for (let i = 0; i < images.length; i++) {
result[i] = getSrc(images[i]);
}
const parent = document.querySelector('селектор элемента, из которого надо кого-то удалить');
const toRemove = [ 3, 1, 666, 2 ];
toRemove
.map(n => parent.children[n])
.filter(Boolean)
.forEach(n => n.remove());
// или
toRemove
.sort((a, b) => b - a)
.forEach(n => parent.children[n]?.remove());
// или
[...parent.children].forEach((n, i) => toRemove.includes(i) && n.remove());
:style="mapStyles"
data() { return { mapStyles: { styles: [
mapStyles: {
на options: {
:style="mapStyles"
на :options="options"
data: () => ({
contact: '',
}),
methods: {
onClick() {
if (this.contact) {
this.$emit('close');
}
},
},
<input v-model="contact">
<button @click="onClick">
const getStrs = (arrs, len) => [
'*'.repeat(len + 2),
...arrs.flatMap(arr => arr
.reduce((acc, n) => {
let g = acc[acc.length - 1];
(g && (g[1] + n.length + !!g[0].length) <= len) || acc.push(g = [ [], 0 ]);
g[1] += n.length + !!g[0].length;
g[0].push(n);
return acc;
}, [])
.map((n, i, a) => `*${n[0].join(' ')[a.length > 1 ? 'padStart' : 'padEnd'](len, ' ')}*`)),
'*'.repeat(len + 2),
];
console.log(getStrs(textArray, 16));
.children(i)
$.each(res, function(i, n) {
this
.eq(i)
.html(`${n[1]}<input type="hidden" value="${n[0]}">`)
.css('display', 'block');
}.bind($('.box-results-search').children()));
{ key: первый индекс, где встречается key }
:const keyIndex = arr.reduce((acc, n, i) => (acc[n.key] ??= i, acc), {});
id
. Можно отсортировать существующий массив:arr.sort((a, b) => (keyIndex[a.key] - keyIndex[b.key]) || (a.id - b.id));
const sorted = (arr, keys) => arr
.map(n => [ n ].concat(keys(n)))
.sort((a, b) => {
let diff = 0;
for (let i = 0; ++i < a.length && !(diff = a[i] - b[i]);) ;
return diff;
})
.map(n => n[0]);
const sortedArr = sorted(arr, n => [ keyIndex[n.key], n.id ]);
const reverse = number => +[...`${Math.abs(number)}`].reverse().join('');
$grouped = [];
foreach ($arr as $brand => $items) {
foreach ($items as $item) {
$data = array_column(json_decode($item['data'], true)['cells'], 'data');
$model = array_shift($data);
if ($model) {
$grouped[$brand][$model][] = array_combine(
[ 'Year', 'Model', 'Bottom', 'Top' ],
$data
);
}
}
}
function getWinner(points) {
const [ a, b ] = points.reduce((acc, n) => (
n.split('-').forEach((m, i) => acc[i] += +m),
acc
), [ 0, 0 ]);
return a === b
? undefined
: a < b ? 2 : 1;
}
const getWinner = points => [ 2, , 1 ][Math.sign(eval(points.join('+'))) + 1];
const [ selected, setSelected ] = useState({});
const onChange = ({ target: { value, dataset: { id } } }) => {
setSelected({ ...selected, [id]: value });
};
return (
<div>
{data.map(({ id, name, variants }) => (
<div>
<div>{name}</div>
<select
value={selected[id]}
data-id={id}
onChange={onChange}
>
<option>ну давай, выбери что-нибудь</option>
{variants.map(n => <option value={n.price}>{n.data.period}</option>)}
</select>
<div>{selected[id] || 'НИЧЕГО НЕ ВЫБРАНО'}</div>
</div>
))}
</div>
);
pre
вместо div
)white-space: pre;
font-family: monospace;
JSON.stringify
, и почитайте. При чтении обратите внимание на то, что параметров у него больше одного. const buttonSelector = 'input[name="group"]';
const contentSelector = '.click';
const activeClass = 'show';
// делегирование, обработчик события добавляем один раз, на документ;
// соответствие между радиокнопками и блоками устанавливаем через равенство атрибутов
document.addEventListener('change', ({ target: t }) => {
if (t.matches(buttonSelector)) {
document.querySelectorAll(contentSelector).forEach(n => {
n.classList.toggle(activeClass, n.dataset.click === t.id);
});
}
});
// или, назначаем обработчик события каждой кнопке индивидуально;
// соответствие между радиокнопками и блоками устанавливаем через равенство индексов
const buttons = document.querySelectorAll(buttonSelector);
const contents = document.querySelectorAll(contentSelector);
buttons.forEach(n => n.addEventListener('change', onChange));
function onChange() {
const index = Array.prototype.indexOf.call(buttons, this);
contents.forEach((n, i) => n.classList.toggle(activeClass, i === index));
}
Object.values(data.reduce((acc, n) => {
(acc[n.code] ||= {
code: n.code,
name: n.name,
variants: [],
}).variants.push(n);
return acc;
}, {}))