const index = arr1.findIndex(n => arr2.indexOf(n) !== -1);// просто массив индексов
const indices = arr1.reduce((acc, n, i) => (arr2.includes(n) && acc.push(i), acc), []);
// объект вида { элемент: индекс первого вхождения }
const indices = arr2.reduce((acc, n) => (
acc[0].hasOwnProperty(n) && (acc[1][n] = acc[0][n]),
acc
), [ arr1.reduce((acc, n, i) => (acc[n] ??= i, acc), {}), {} ])[1];
// Map вида { элемент: массив всех индексов данного элемента }
const indices = arr1.reduce((acc, n, i) => (
acc[0].has(n) && acc[1].set(n, acc[1].get(n) ?? []).get(n).push(i),
acc
), [ new Set(arr2), new Map ])[1];
const runTasks = (tasks, max = 1) =>
new Promise(resolve => {
const results = Array(tasks.length).fill(null);
let started = 0;
let finished = 0;
for (let i = Math.max(1, Math.min(max, tasks.length)); i--; run()) ;
async function run() {
if (finished === tasks.length) {
resolve(results);
} else if (started < tasks.length) {
const index = started++;
try {
results[index] = await tasks[index]();
} catch (e) {
results[index] = e;
}
finished++;
run();
}
}
});
const sendRequests = (urls, ...args) =>
runTasks(urls.map(n => () => fetch(n).then(r => r.json())), ...args);
const printf = (str, ...params) =>
str.replace(/\$(\d+)/g, (m, g1) => params[~-g1] ?? m);
const groupedAndSortedArr = Object
.values(arr.reduce((acc, n) => ((acc[n[0]] ??= []).push(n), acc), {}))
.sort((a, b) => a[0][0].localeCompare(b[0][0]));
str.split('=').pop()
// или
str.slice(str.indexOf('=') + 1)str.replace(/[^=]*=/, '')
// или
str.match(/(?<==).*/)[0]
// или
/[^=]*$/.exec(str).shift()new URLSearchParams(str).get('sort')
const obj = [...str.matchAll(/([^?&]+)=([^&]+)/g)]
.reduce((acc, [ , k, v ]) => (
k.endsWith('[]')
? (acc[k.slice(0, -2)] ??= []).push(v)
: acc[k] = v,
acc
), {});const params = new URLSearchParams(str);
const reg = /\[\]$/;
const obj = Object.fromEntries(Array.from(
new Set(params.keys()),
n => [
n.replace(reg, ''),
params[reg.test(n) ? 'getAll' : 'get'](n),
]
));const obj = str.split('?').pop().split('&').reduce((acc, n) => {
let [ k, v ] = n.split('=');
const isArr = k.slice(-2) === '[]';
k = k.substring(0, k.length - isArr * 2);
const target = (isArr ? (acc[k] = acc[k] || []) : acc);
target[isArr ? target.length : k] = v;
return acc;
}, {});
const key = 'strategy';.const result = arr.filter(function(n) {
return this.has(n[key]);
}, new Set(arr2));const result = arr2.flatMap(((values, n) => values[n] ?? []).bind(
null,
arr.reduce((acc, n) => ((acc[n[key]] ??= []).push(n), acc), {})
));const result = [];
for (const n of arr) {
for (const m of arr2) {
if (m === n[key]) {
result.push(n);
break;
}
}
}const result = [];
for (let i = 0; i < arr.length; i++) {
if (~arr2.indexOf(arr[i][key])) {
result[result.length] = arr[i];
}
}const result = (function get(i, n = arr[i]) {
return n
? [].concat(arr2.includes(n[key]) ? n : [], get(-~i))
: [];
})(0);
const container = document.body;
const key = 'number';
const attr = `data-${key}`;
const attrSelector = `[${attr}]`;container.addEventListener('click', function(e) {
const value = e.target.closest(attrSelector)?.dataset[key];
if (value) {
this.querySelectorAll(`[${attr}="${value}"]`).forEach(n => n.remove());
}
});const elems = [...container.querySelectorAll(attrSelector)];
const onClick = ({ currentTarget: { attributes: { [attr]: { value } } } }) =>
elems.length -= elems.reduce((acc, n, i, a) => (
a[i - acc] = n,
acc + (n.getAttribute(attr) === value && !n.replaceWith())
), 0);
elems.forEach(n => n.addEventListener('click', onClick));
function haveSameValues(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
const count = new Map;
arr1.forEach(n => count.set(n, -~count.get(n)));
arr2.forEach(n => count.set(n, ~-count.get(n)));
for (const n of count.values()) if (n) {
return false;
}
return true;
}haveSameValues(
[ 'hello, world!!', 0, 0, 0, 1, 1, false, false ],
[ false, false, 1, 1, 0, 0, 0, 'hello, world!!' ]
) // true
haveSameValues(
[ 1, 2, 3 ],
[ 3, 2, 2 ]
) // false
haveSameValues(
[],
[]
) // true
const arr = Array.from(
new Set(Array.from(document.querySelectorAll('.shop_name'), n => n.innerText)),
n => ({ name: n })
);const arr = Object.values(Array.prototype.reduce.call(
document.getElementsByClassName('shop_name'),
(acc, { textContent: name }) => (acc[name] ??= { name }, acc),
{}
));
wrapper.innerHTML = Array
.from(word.value, n => obj[n] ? `<img src="${obj[n]}">` : '')
.join('');for (let n = null; n = wrapper.lastChild; n.remove()) ;
for (const n of word.value) {
if (obj.hasOwnProperty(n)) {
const img = new Image;
img.src = obj[n];
wrapper.append(img);
}
}
// или
wrapper.replaceChildren(...Array.prototype.reduce.call(
word.value,
(acc, n) => (
obj[n] && ((acc[acc.length] = new Image).src = obj[n]),
acc
),
[]
));while (word.value.length < wrapper.children.length) {
wrapper.removeChild(wrapper.lastElementChild);
}
while (word.value.length > wrapper.children.length) {
wrapper.appendChild(document.createElement('img'));
}
Array.prototype.forEach.call(wrapper.children, (n, i) => {
const src = obj[word.value[i]];
if (!(n.hidden = !src)) {
n.src = src;
}
});let obj = { 'а': 'https://github.com/itsFide/converter/blob/master/img/а.png?raw=true', 'А': 'https://github.com/itsFide/converter/blob/master/img/а.png?raw=true', 'б':'https://github.com/itsFide/converter/blob/master/img/б.png?raw=true', ...
const obj = Object.fromEntries(Array.prototype.flatMap.call(
'абвгдеёжзийклмнопрстуфхцчшщъыьэюя', n => {
const url = `https://github.com/itsFide/converter/blob/master/img/${n}.png?raw=true`;
return [
[ n, url ],
[ n.toUpperCase(), url ],
];
}
));
function getPaths(obj, path = [ '' ]) {
const entries = Object.entries(obj);
return entries.length
? entries.reduce((acc, n) => (
path.push(n[0]),
acc.push(...getPaths(n[1], path)),
path.pop(),
acc
), [])
: [ path.join('/') ];
}
const paths = getPaths(pages);const getPaths = function*(root) {
for (const stack = this(root, [ '' ]); stack.length;) {
const [ obj, path ] = stack.pop();
const next = this(obj, path);
stack.push(...next);
if (!next.length) {
yield path.join('/');
}
}
}.bind((obj, path) => Object.keys(obj).reverse().map(n => [ obj[n], [ ...path, n ] ]));
const paths = [...getPaths(pages)];
function shortNumber(val) {
const abs = Math.abs(val);
const prefixIndex = Math.log10(abs) / 3 | 0;
return (
(val < 0 ? '-' : '') +
Math.round(abs / (10 ** (prefixIndex * 3))) +
'KMGTPEZY'.charAt(~-prefixIndex)
);
}shortNumber(99) // '99'
shortNumber(1945) // '2K'
shortNumber(-5839465) // '-6M'
shortNumber(7e10) // '70G'
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());
const elements = document.querySelectorAll('.descr');const addText = (el, index) =>
el.append(arr[index]);
// или
// el.replaceChildren(arr[index]);
// el.textContent = arr[index];
// el.innerText = arr[index];
// el.innerHTML = arr[index];
// el.appendChild(document.createTextNode(arr[index]));
// el.insertBefore(new Text(arr[index]), null);
// el.insertAdjacentText('beforeend', arr[index]);
// el.insertAdjacentHTML('beforeend', arr[index]);elements.forEach(addText);
// или
for (const [ i, n ] of elements.entries()) {
addText(n, i);
}
// или
for (let i = 0; i < elements.length; i++) {
addText(elements[i], i);
}
// или
(function next(i, n = elements.item(i)) {
n && (addText(n, i), next(-~i));
})(0);