Object.values(orders.reduce((acc, n) => {
const date = n.date.split(' ')[0];
((acc[date] ??= {
date,
documents: {},
}).documents[n.docTypesName] ??= {
date: n.date,
docId: n.docId,
docTypesName: n.docTypesName,
products: [],
}).products.push({
name: n.name,
price: n.price,
image: n.image,
qunatity: n.quantity,
});
return acc;
}, {})).map(n => (n.documents = Object.values(n.documents), n))
async function test() {
let result = null;
do {
result = await camel() || await new Promise(r => setTimeout(r, 1000));
} while (!result);
return result;
}
const flatten = arr => [].concat(...arr.map(n => Array.isArray(n) ? flatten(n) : n));
// или
function flatten(arr) {
const result = [];
for (const n of arr) {
if (n?.constructor === Array) {
[].push.apply(result, flatten(n));
} else {
result.push(n);
}
}
return result;
}function flatten(arr) {
const result = [];
const stack = [];
for (let i = 0; i < arr.length || stack.length; i++) {
if (i === arr.length) {
[ i, arr ] = stack.pop();
} else if (arr[i] instanceof Array) {
stack.push([ i, arr ]);
[ i, arr ] = [ -1, arr[i] ];
} else {
result.push(arr[i]);
}
}
return result;
}
// или
function flatten([...arr]) {
for (let i = 0; i < arr.length; i++) {
const n = arr[i];
if (n?.[Symbol.iterator] && typeof n !== 'string') {
arr.splice(i--, 1, ...n);
}
}
return arr;
}
words.some(n => str.includes(n))
const openSelector = '.block__item';
const closeSelector = '.close';
const itemSelector = '.popup';
const activeClass = 'popup--active';
// делегирование, общий обработчик клика - для открытия и закрытия сразу,
// назначается один раз для всех элементов;
// связь кнопок открытия попапов с попапами через data-атрибут
document.addEventListener('click', ({ target: t }) => {
let item = t.closest(closeSelector)?.closest(itemSelector);
if (!item) {
const open = t.closest(openSelector);
if (open) {
item = document.querySelector(`${itemSelector}.${open.dataset.popup}`);
}
}
item?.classList.toggle(activeClass);
});
// или, отдельные обработчики клика для открытия и закрытия,
// назначаются каждому элементу индивидуально;
// связь кнопок открытия попапов с попапами через индексы
const open = [...document.querySelectorAll(openSelector)];
const close = document.querySelectorAll(closeSelector);
const items = document.querySelectorAll(itemSelector);
const onOpenClick = e => items[open.indexOf(e.currentTarget)].classList.add(activeClass);
open.forEach(n => n.addEventListener('click', onOpenClick));
const onCloseClick = e => e.currentTarget.closest(itemSelector).classList.remove(activeClass);
close.forEach(n => n.addEventListener('click', onCloseClick));
params = format({params_list = Object.values(params) console.log(params_list) for (var v in params_list) {s=s+v+'='+params[v]+'&'}
function format(params, method) {
return `https://api.vk.com/method/${method}?${new URLSearchParams(params)}`;
}
console.log(format({ access_token, version }, method));
const sum = arr.reduceRight((acc, n) => n && acc + n, 0);let sum = 0;
for (let i = 0; arr[i]; sum += arr[i++]) ;let sum = 0;
for (const n of arr) {
if (!n) {
break;
}
sum += n;
}const sum = (function sum(i, n = arr[i]) {
return n ? n + sum(i + 1) : 0;
})(0);
Array одно число, будет создан (будет попытка создания - отрицательные и нецелые числа приведут к ошибке) массив указанной длины. Метод push может принимать несколько значений, а возвращает - новую длину массива, после добавления элементов. Т.е., в массив из трёх элементов добавили ещё четыре, и получили длину.
arr.sort((a, b) => {
return Number.isNaN(+a) || Number.isNaN(+b)
? a.localeCompare(b)
: a - b;
});
// или
arr.sort((a, b) => (a - b) || a.localeCompare(b));const sorted = (arr, keys) => arr
.map(n => [ n ].concat(keys(n)))
.sort((a, b) => {
let diff = 0;
a.find((n, i) => diff = i && ((n < b[i]) ? -1 : +(n > b[i])));
return diff;
})
.map(n => n[0]);
const sortedArr = sorted(arr, n => [ +n, n.toLowerCase() ]);
const list = arrToSinglyLinkedList(arr, 'child');const arrToSinglyLinkedList = (arr, nextKey = 'next') =>
arr.reduceRight((acc, n) => ({ ...n, [nextKey]: acc }), null);
// или
function arrToSinglyLinkedList(arr, nextKey = 'next') {
let list = null;
for (let i = arr.length; i--;) {
const node = Object.assign({}, arr[i]);
node[nextKey] = list;
list = node;
}
return list;
}const arrToSinglyLinkedList = (arr, nextKey = 'next', i = 0) =>
i < arr.length
? Object.fromEntries([
...Object.entries(arr[i]),
[ nextKey, arrToSinglyLinkedList(arr, nextKey, -~i) ]
])
: null;
// или
function arrToSinglyLinkedList(arr, nextKey = 'next', i = 0, n = arr[i]) {
const node = n ? {} : null;
if (node) {
for (const k in n) {
if (n.hasOwnProperty(k)) {
node[k] = n[k];
}
}
node[nextKey] = arrToSinglyLinkedList(arr, nextKey, i + 1);
}
return node;
}
this - это и будет ссылка на нужный элемент. Конечно, только в том случае, если какое-то другое значение не было заранее привязано к обработчику (как такое может быть - bind и стрелочные функции).target с помощью closest.
const parent = document.querySelector('.xlist');
const className = 'active';
const el = parent.querySelector(`:scope > .${className}`);const index = el ? [...parent.children].indexOf(el) : -1;let index = -1;
for (let n = el; n; n = n.previousElementSibling, index++) ;const index = Array.prototype.findIndex.call(
parent.children,
n => n.classList.contains(className)
);const { children } = parent;
let index = children.length;
while (index-- && !children[index].matches(`.${className}`)) ;
function fb3cont() { b3Cont.classList.remove("__active"); } document.onclick = function() { if (b3Cont.classList.contains("__active")) { fb3cont()}; }