const arrs = [ arr1, arr2 ];
), дальше есть варианты:const result = arrs[0].map((_, i) => arrs.flatMap(arr => arr[i]));
const result = arrs.reduce((acc, arr) => (
arr.forEach((n, i) => (acc[i] ??= []).push(...n)),
acc
), []);
const result = [];
for (const arr of arrs) {
for (const [ i, n ] of arr.entries()) {
if (!result[i]) {
result[i] = [];
}
for (const m of n) {
result[i][result[i].length] = m;
}
}
}
document.querySelectorAll('.item').forEach((n, i) => n.dataset.priority = ++i);
// или
for (const [ i, n ] of document.querySelectorAll('.item').entries()) {
n.setAttribute('data-priority', i + 1);
}
// или
const items = document.getElementsByClassName('item');
for (let i = 0; i < items.length; i++) {
items[i].attributes['data-priority'].value = -~i;
}
где ошибка?
const maxlen = Math.max(...arr.map(n => n.length));
// или
const maxlen = arr.reduce((max, { length: n }) => max > n ? max : n, -Infinity);
fetch('https://gorest.co.in/public/v1/posts')
.then(r => r.json())
.then(r => {
// собираем разметку
document.body.insertAdjacentHTML('beforeend', `
<ul>${r.data.map(n => `
<li>
<a>${n.title}</a>
</li>`).join('')}
</ul>
`);
// или, создаём элементы напрямую
const ul = document.createElement('ul');
ul.append(...r.data.map(n => {
const li = document.createElement('li');
const a = document.createElement('a');
a.textContent = n.title;
li.append(a);
return li;
}));
document.body.append(ul);
});
const type = x => x == null ? x : x.constructor;
type() === undefined // true
type(null) === null // true
type(/./) === RegExp // true
type(187) === Number // true
type(type) === Function // true
const typename = x => x?.constructor.name ?? `${x}`;
typename() // 'undefined'
typename(null) // 'null'
typename(false) // 'Boolean'
typename('hello, world!!') // 'String'
typename({}) // 'Object'
typename([]) // 'Array'
typename(document.body) // 'HTMLBodyElement'
typename(document.getElementsByClassName('xxx')) // 'HTMLCollection'
typename(new class XXX {}) // 'XXX'
typename((c => new class YYY extends c {})(class XXX {})) // 'YYY'
typename(typename) // 'Function'
false
, повторно (т.е., представлен в более чем одном из исходных массивов) будет true
; хватаем элементы, которые false
:const diff = (...arrs) => Array
.from(arrs
.flatMap(arr => [...new Set(arr)])
.reduce((acc, n) => acc.set(n, acc.has(n)), new Map))
.reduce((acc, n) => (n[1] || acc.push(n[0]), acc), []);
Map
, где ключами будут элементы вложенных массивов, а значениями множества вложенных массивов, где присутствует данный элемент. Получаем те ключи, где размер множества равен единице:const diff = (...arrs) => Array
.from(arrs.reduce((acc, arr) => (
arr.forEach(n => acc.set(n, acc.get(n) ?? new Set).get(n).add(arr)),
acc
), new Map))
.reduce((acc, n) => (n[1].size === 1 && acc.push(n[0]), acc), []);
Map
и Set
- проверяем, что элемент вложенного массива отсутствует во всех других вложенных массивах и в результирующем массиве:const diff = (...arrs) =>
arrs.reduce((acc, arr) => (
arr.forEach(n =>
arrs.every(m => m === arr || !m.includes(n)) &&
!acc.includes(n) &&
acc.push(n)
),
acc
), []);
document.querySelector('.calc_container').addEventListener('input', e => {
const block = e.target.closest('.calc_block');
const price = +block.querySelector('.price span').innerText;
const count = +e.target.value;
block.querySelector('.summ span').innerText = price * count;
const orderData = Array
.from(e.currentTarget.querySelectorAll('.calc_block'), n => ({
name: n.querySelector('label').innerText,
count: +n.querySelector('.count').value,
sum: +n.querySelector('.summ span').innerText,
}))
.filter(n => n.count);
document.querySelector('.total_block span').innerText = orderData
.reduce((acc, n) => acc + n.sum, 0);
document.querySelector('textarea').value = orderData
.map(n => `Название: ${n.name} | Количество: ${n.count}`)
.join('\n');
});
const chunkedAndTransposed = ([ headers, ...arr ], chunkSize) =>
arr.reduce((acc, n, i) => (
(i % chunkSize) || acc.push(headers.map(m => [ m ])),
n.forEach((m, j) => acc.at(-1)[j].push(m)),
acc
), []);
const result = chunkedAndTransposed(arr, 2);
const chunkedAndTransposed = (arr, chunkSize, defautlValue = null) =>
Array.from({ length: Math.ceil((arr.length - 1) / chunkSize) }, (_, iChunk) =>
Array.from({ length: arr[0].length }, (_, iCol) =>
Array.from({ length: chunkSize + 1 }, (_, iRow) =>
iRow ? arr[iChunk * chunkSize + iRow]?.[iCol] ?? defautlValue : arr[0][iCol]
)
)
);
const result = chunkedAndTransposed(arr, 5);
const today = new Date().getDate();
const select = document.querySelector('select');
const toggle = option => option.disabled = option.value < today;
select.querySelectorAll('option').forEach(toggle);
// или
Array.prototype.forEach.call(select, toggle);
// или
for (const n of select.options) {
toggle(n);
}
// или
for (let i = 0; i < select.children.length; i++) {
toggle(select.children[i]);
}
const duplicateContent = el =>
// можно добавить копии вложенных узлов
el.append(...el.cloneNode(true).childNodes);
// или добавить копию разметки
// el.insertAdjacentHTML('beforeEnd', el.innerHTML);
// или перезаписать разметку в удвоенном виде
// el.innerHTML += el.innerHTML;
// el.innerHTML = el.innerHTML.repeat(2);
// el.innerHTML = Array(3).join(el.innerHTML);
// el.innerHTML = String.prototype.concat.apply('', Array(2).fill(el.innerHTML));
// el.innerHTML = el.innerHTML.replace(/.+/, '$&$&');
// el.innerHTML = /(.+)/.exec(el.innerHTML).join``;
document.querySelectorAll('.btn').forEach(duplicateContent);
// или
for (const n of document.getElementsByClassName('btn')) {
duplicateContent(n);
}
const getDuplicatesIndex = (arr, key = n => n) =>
Object.fromEntries(Object
.entries(arr.reduce((acc, n, i) => ((acc[key(n)] ??= []).push(i), acc), {}))
.filter(n => n[1].length > 1)
);
Map
:const getDuplicatesIndex = (arr, key = n => n) =>
new Map(Array
.from(arr.reduce((acc, n, i) => {
const k = key(n);
acc.set(k, acc.get(k) ?? []).get(k).push(i);
return acc;
}, new Map))
.filter(n => ~-n[1].length)
);
const longestStr = arr.reduce((max, n) => max.length > n.length ? max : n, '');
// или
const longestStr = arr.sort((a, b) => b.length - a.length)[0];
// или
const longestStr = arr.reduce((acc, n) => (acc[n.length] = n, acc), []).pop();
function max(data, key = n => n) {
const getVal = key instanceof Function ? key : n => n[key];
let result = null;
for (const n of data) {
const val = getVal(n);
if (!result || result[1] < val) {
result = [ n, val ];
}
}
return result?.[0];
}
const longestStr = max(arr, 'length');
const getRepetition = (arr, repeated) => Array
.from(arr.reduce((acc, n) => acc.set(n, -~acc.get(n)), new Map))
.reduce((acc, n) => (n[1] === repeated && acc.push(n[0]), acc), []);
function getRepetition(arr, repeated) {
const result = [];
const count = {};
for (const n of arr) {
if (!count.hasOwnProperty(n)) {
count[n] = 0;
}
count[n]++;
}
for (const n in count) {
if (count[n] === repeated) {
result.push(+n);
}
}
return result;
}
$(document).click('.e-1', function(event) { console.log(event.target) });
$(document).on('click', '.e-1', function(e) {
console.log(e.currentTarget);
});
'*'
в качестве результата, реально вы выдаёте '*\n'
..join('\n')
. Ну и ещё пробелов не хватает после звёздочек.const christmasTree = length =>
Array.from({ length }, (n, i) => (
n = ' '.repeat(length - i - 1),
n + '*'.repeat(i * 2 + 1) + n
)).join('\n');