const ul = document.querySelector('ul');
const parent = ul.parentElement;
let e = null;
[...ul.children].forEach((li, i, arr) => {
if (li.classList.contains('main')) {
e && parent.appendChild(e);
e = document.createElement('ul');
} else if (i === arr.length - 1) {
parent.appendChild(e);
}
e.appendChild(li);
});
ul.remove();
form.addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(form);
formData.append('someField', someValue);
// ...
});
const acc = arr.reduce((acc, el) => ({...acc, [el]: (acc[el] || 0) + 1}), {});
const sortedArr = Object.keys(acc).sort((a, b) => acc[b] - acc[a]);
code должен возвращать JSON-объект, описывающий виджет. Элементы виджета могут содержать только внутренние ссылки на vk.com (кроме away.php) и vk.me.
В общем случае параметр code выглядит так:
return { widget };
const widget = {
"title": "My Table",
"title_url": "https://link",
"title_counter": 31,
// ...
};
vk.api.appWidgets.update({
type: `Table`,
code: 'return ' + JSON.stringify(widget) + ';'
})
На входе есть массив, который я перевожу в объект.нет, метод map возвратит массив
const b = Object.fromEntries(a); // {1: "Вася", 2: "Петя", 3: "Коля", 4: "Федя"}
async function getUserId(message) {
if (message.hasReplyMessage) {
return message.replyMessage.senderId;
} else if (message.hasForwards) {
return message.forwards[0].senderId;
} else {
const res = await vk.snippets.resolveResource(message.$match[1]);
return res.id;
}
}
vk.updates.hear(/^(?:-добавить|-друг)\s?([^]+)?/i, async (message) => {
if(message.senderId !== 348543284) return message.send(`У вас недостаточно прав!`)
let userId = await getUserId(message);
let tex = `Денис отправил/одобрил заявку!`
vk.api.friends.add({ user_id: userId, text: tex })
return message.send(`Вы отправили/одобрили заявку`);
});
class BroadcastEventEmitter extends EventEmitter {
emit(event, ...args) {
if (event === '*') {
Object.keys(this.events).forEach((e) => super.emit(e, ...args));
} else {
super.emit(event, ...args);
}
}
}
function sortByExt(files) {
function getFileInfo(val) {
const arr = val.split('.');
return {
ext: arr.pop(),
name: arr.join('.')
}
}
function compare(s1, s2) {
if (s1 < s2) {
return -1;
}
if (s1 > s2) {
return 1;
}
return 0;
}
return files.sort((a, b) => {
const {ext: aExt, name: aName} = getFileInfo(a);
const {ext: bExt, name: bName} = getFileInfo(b);
return compare(aExt, bExt) || compare(aName, bName);
});
}
const relatedList = el ? [el] : main.querySelectorAll('.products-wrapper');
function getTextInComments(el) {
return [...el.childNodes].reduce((acc, curr) => {
if (curr.nodeType === Node.ELEMENT_NODE) {
acc.values.push(...getTextInComments(curr));
} else if (curr.nodeType === Node.COMMENT_NODE) {
acc.isComment = !acc.isComment;
} else if (curr.nodeType === Node.TEXT_NODE && acc.isComment) {
acc.values.push(curr.textContent);
}
return acc;
}, {
values: [],
isComment: false
}).values;
}
const arr = getTextInComments(document.querySelector('.box'));