попытался решить все через рекурсию
const createTree = (data, parentId = null) =>
data.reduce((acc, n) => (
parentId === n.parentId && (
acc[acc.length] = Object.assign(
{ children: createTree(data, n.id) },
n
)
),
acc
), []);function createTree({
data,
key = 'id',
parentKey = 'parentId',
childrenKey = 'children',
}) {
const tree = Object.fromEntries(data.map(n => [
n[key],
{ ...n, [childrenKey]: [] },
]));
return Object.values(tree).filter(n => !(
tree[n[parentKey]] && tree[n[parentKey]][childrenKey].push(n)
));
}
data-rel ссылки кладём в аналогичный атрибут:<button class="cve" data-rel="69c99408142132">S</button>
<button class="cve" data-rel="69c99408143167">M</button>
<button class="cve" data-rel="69c99408143177">L</button>if (t.classList.contains('cve')), но кто его знает, может, решите в будущем добавить внутрь кнопок ещё какие-то элементы):document.addEventListener('click', ({ target: t }) => {
if (t = t.closest('.cve')) {
document.getElementById('bodyone').dataset.rel = t.dataset.rel;
}
});const el = document.querySelector('#bodyone');
const onClick = e => el.dataset.rel = e.currentTarget.dataset.rel;
document.querySelectorAll('.cve').forEach(n => n.addEventListener('click', onClick));
const result = array
.concat(obj)
.reduceRight((acc, n) => ({
...n,
children: acc ? [ acc ] : [],
// или, если вдруг исходные массивы непустые,
// и их содержимое надо сохранить
// children: n.children.concat(acc || []),
}), null);const result = [ ...array, obj ].reduceRight(
(acc, { children, ...n }) => (n.next = acc, n),
null
);
const isEmpty = [...inputs].some(n => !n.value);
// или
const isEmpty = !Array.prototype.every.call(inputs, n => n.value);
// или
let isEmpty = false;
for (const n of inputs) {
if (!n.value) {
isEmpty = true;
break;
}
}
// или
let isEmpty = false;
for (let i = -1; ++i < inputs.length && !(isEmpty = !inputs[i].value);) ;
// или
const isEmpty = (function isEmpty(i, n = inputs.item(i)) {
return !!n && (!n.value || isEmpty(-~i));
})(0);
const grouped = Object.entries(list.reduce((acc, n) => (
(acc[n.part] = acc[n.part] || []).push(n.title),
acc
), {}));document.body.insertAdjacentHTML('beforeend', grouped
.map(([ k, v ]) => `<div>${k}</div>${v.map(n => `<div>${n}</div>`).join('')}`)
.join('')
);document.body.append(...grouped.flat(2).map(n => {
const div = document.createElement('div');
div.innerText = n;
return div;
}));
const selector = '.form-group';
const attr = 'data-property-id-row';
const values = [ 10, 13, 15 ];const elementsToHide = document.querySelectorAll(values
.map(n => `${selector}[${attr}="${n}"]`)
.join(', ')
);for (let i = 0; i < elementsToHide.length; i++) {
elementsToHide[i].style.transform = 'scale(0)';
}
// или
(function next(i, n = elementsToHide.item(i)) {
n && (n.style.visibility = 'hidden', next(-~i));
})(0);const elements = document.querySelectorAll(selector);for (const n of elements) {
n.hidden = values.includes(Number(n.attributes[attr].value));
}
// или (в стили надо будет добавить .hidden { display: none; })
elements.forEach(function(n) {
n.classList.toggle('hidden', this.has(+n.getAttribute(attr)));
}, new Set(values));
$("#changeCityInput").bind("keyup change",$('#changeCityInput').on('input',
function createTree(data, key, parentKey) {
const nodesArr = data.map(n => ({ ...n, children: [], parents: [] }));
const nodesObj = Object.fromEntries(nodesArr.map(n => [ n[key], n ]));
const roots = nodesArr.filter(n =>
!(nodesObj[n[parentKey]] && nodesObj[n[parentKey]].children.push(n))
);
nodesArr.forEach(n => {
for (let p = n; p = nodesObj[p[parentKey]]; n.parents.push(p)) ;
});
return [ roots, nodesObj ];
}{ id: узел }.const [ roots, tree ] = createTree(data, 'structureId', 'parentId');
const checked = Array.from(document.querySelectorAll('.btn:checked'), n => n.value);
const filtered = arr.filter(n => checked.includes(n));
const createList = arr =>
arr.reduceRight((acc, n) => ({
val: n,
next: acc,
}), null);function createList(arr) {
let list = null;
for (let i = arr.length; i--;) {
list = {
val: arr[i],
next: list,
};
}
return list;
}const createList = (arr, i = 0) =>
i < arr.length
? ({ val: arr[i], next: createList(arr, i + 1) })
: null;
button.addEventListener('click', () => {
anotherButton.click();
});button.addEventListener('click', () => {
anotherButton.dispatchEvent(new Event('click', { bubbles: true }));
});
.push(x) на .push([...x]).function pyramid(n) {
const result = [];
for (let i = 0; ++i <= n;) {
const x = [];
for (let j = 0; ++j <= i; x.push(1)) ;
result.push(x);
}
return result;
}const pyramid = length => Array.from({ length }, (_, i) => Array(i + 1).fill(1));
const filterObject = (obj, values) =>
Object.entries(obj).reduce((acc, [ k, v ]) => (
values.indexOf(v) !== -1 && (acc[k] = v),
acc
), {});
const result = filterObject(a, b);const filterObject = (obj, filter) =>
Object.fromEntries(Object.entries(obj).filter(n => filter(...n)));
const result = filterObject(a, (k, v) => b.includes(v));