const parent = document.querySelector('.container');
const className = 'green';
const startFrom = 4;parent
.querySelectorAll(`:scope > :nth-child(n + ${startFrom + 1})`)
.forEach(n => n.classList.add(className));
// или
for (const n of Array.prototype.slice.call(parent.children, startFrom)) {
n.classList.add(className);
}
// или
for (let el = parent.children[startFrom]; el; el = el.nextElementSibling) {
el.classList.add(className);
}
// или, также удаляем класс (если вдруг есть) у тех, кому он не должен быть добавлен
for (let i = 0; i < parent.children.length; i++) {
parent.children[i].classList.toggle(className, i >= startFrom);
}
function createRandomArr(size, min, max) {
if (size > (max -= ~-min)) {
throw 'невозможно создать массив указанного размера';
}
const values = new Set;
for (; values.size < size; values.add(min + Math.random() * max | 0)) ;
return [...values];
}function createRandomArr(size, min, max) {
const len = max - min + 1;
const arr = [...Array(len).keys()];
return Array.from(
{ length: Math.min(size, len) },
() => min + arr.splice(Math.random() * arr.length | 0, 1)[0]
);
}function createRandomArr(size, min, max) {
const arr = Array.from(
{ length: max - min + 1 },
(_, i) => i + min
);
for (let i = arr.length; --i > 0;) {
const j = Math.floor(Math.random() * (i + 1));
[ arr[j], arr[i] ] = [ arr[i], arr[j] ];
}
return arr.slice(-size);
}
const values = [ id, sum, system, date ];.payment.innerHTML = values.map(n => `<td>${n}</td>`).join('');
// или
values.forEach(n => payment.insertCell().textContent = n);
// или
payment.append(...values.map(n => {
const td = document.createElement('td');
td.innerText = n;
return td;
}));- function createPayment({id, sum, system, date}) {
+ function createPayment(data) {- const values = [ id, sum, system, date ];
+ const keys = [ 'id', 'sum', 'system', 'date' ];- values.forEach(n => payment.insertCell().textContent = n);
+ keys.forEach(n => payment.insertCell().textContent = data[n]);
const getKeys = obj =>
obj instanceof Object
? Object.entries(obj).flatMap(n => [ n[0], ...getKeys(n[1]) ])
: [];
const keys = getKeys(obj);function* getKeys(obj) {
if (Object(obj) === obj) {
for (const k in obj) if (obj.hasOwnProperty(k)) {
yield k;
yield* getKeys(obj[k]);
}
}
}
const keys = [...getKeys(obj)];
const propsCount = 3;.const newObj = Object.fromEntries(Object
.entries(obj)
.sort((a, b) => a[1] - b[1])
.slice(-propsCount)
);Object
.entries(obj)
.sort((a, b) => b[1] - a[1])
.slice(propsCount)
.forEach(n => delete obj[n[0]]);
const numbers = (str.match(/>\d+/g) ?? []).map(n => +n.slice(1));
// или
const numbers = Array.from(str.matchAll(/(?<=>)\d+/g), Number);
// или
const numbers = (function get(reg) {
const m = reg.exec(str)?.[1];
return m ? [ parseInt(m), ...get(reg) ] : [];
})(/>(\d+)/g);
''.concat(...Array.from(str, n => n.repeat(2)))
// или
str.replace(/./g, '$&$&')
// или
str.replace(/./g, m => Array(3).join(m))
// или
str.replace(/(?=.)/g, (m, i) => str[i])
// или
[...str].flatMap(n => Array(2).fill(n)).join('')
// или
[].map.call(str, n => `${n}${n}`).join``
// или
str.split('').reduce((acc, n) => acc + n + n, '')
const averageAge = arr.reduce((acc, n) => acc + n.age, 0) / arr.length;function avg(data, key = n => n) {
const getVal = key instanceof Function ? key : n => n[key];
let sum = 0;
let count = 0;
for (const n of data) {
sum += getVal(n);
count += 1;
}
return sum / count;
}const averageAge = avg(arr, 'age');.avg(Array(10).keys()) // 4.5
avg('12345', Number) // 3
avg(document.images, n => n.width) // сами посмотрите, сколько тут получится
arr.reduce((acc, n, i) => (
(!i || n === 1) && acc.push([]),
acc[acc.length - 1].push(n),
acc
), [])
const index = arr.reduce((min, n, i, a) => a[min]?.length <= n.length ? min : i, -1);
if (index !== -1) {
arr[index] = arr[index][0].toUpperCase() + arr[index].slice(1);
}const [ indexes ] = arr.reduce((min, n, i) => (
n.length < min[1] && (min = [ [], n.length ]),
n.length === min[1] && min[0].push(i),
min
), [ [], Infinity ]);
indexes.forEach(n => arr[n] = arr[n].replace(/./, m => m.toUpperCase()));
const date = new Date(str.replace(/\S+/, m => m.split('.').reverse().join('-')));const date = new Date(str.replace(/(\d+)\.(\d+)\.(\d+)/, '$3-$2-$1'));const [ day, month, year, hours, minutes, seconds ] = str.split(/\D/);
const date = new Date(year, month - 1, day, hours, minutes, seconds);const date = dayjs(str, 'DD.MM.YYYY HH:mm:ss').toDate();
function sort([...arr]) {
const max = arr.reduce((max, n) => max?.population > n.population ? max : n, null);
return arr.sort((a, b) => a === max ? -1 : b === max ? 1 : a.city.localeCompare(b.city));
}
const className = 'model';const elements = document.querySelectorAll(`.${className}`);
// или
const elements = document.getElementsByClassName(className);const getText = el => el.textContent;
// или
const getText = el => el.innerText;
// или
const getText = el => el.innerHTML;
// или
const getText = el => el.lastChild.nodeValue;
// или
const getText = el => el.childNodes[0].data;const result = Array.from(elements, getText).join(', ');
// или
const result = ''.concat(...[...elements].flatMap((n, i) => (
n = getText(n),
i ? [ ', ', n ] : n
)));
// или
const result = Array.prototype.reduce.call(
elements,
(acc, n, i) => acc + (i ? ', ' : '') + getText(n),
''
);
// или
const result = (function get(i, n = elements[i]) {
return n
? `${i ? ', ' : ''}${getText(n)}${get(i + 1)}`
: ''
})(0);
const { x: countX = 0, o: countO = 0 } = Array
.from(str.toLowerCase())
.reduce((acc, n) => (acc[n] = (acc[n] ?? 0) + 1, acc), {});const [ countX, countO ] = [ /x/i, /o/i ].map(n => ~-str.split(n).length);
const xxx = (() => {
function f() {
return arguments.length ? f.bind([].concat.apply(this, arguments)) : this;
}
return f.bind([]);
})();
// или
const xxx = (...args1) => (...args2) =>
args2.length
? xxx(...args1, ...args2)
: args1;xxx(1, 2)(3, 4)() // [1, 2, 3, 4]
const t = xxx(1, 3, 5);
t(7)() // [1, 3, 5, 7]
t(3)(1)() // [1, 3, 5, 3, 1]
найти объект
найти самое большое значение
const obj = arr.flat().reduce((max, n) => max?.age > n.age ? max : n, null);const val = Math.max(...arr.flat().map(n => n.age));const objs = arr.reduce((acc, n) => (
n.forEach(m => (
m.age > acc[0] && (acc = [ m.age, [] ]),
m.age === acc[0] && acc[1].push(m)
)),
acc
), [ -Infinity, [] ])[1];
[...new Map(arr.map(n => [ n.value, n ])).values()]
// или
Object.values(arr.reduce((acc, n) => (acc[n.value] ??= n, acc), {}))arr.filter(function(n) {
return !(this[n.value] = this.hasOwnProperty(n.value));
}.bind({}))
// или
arr.filter(function({ value }) {
return !this.set(value, this.has(value)).get(value);
}, new Map)
// или
arr.filter(((picked, { value: n }) =>
!picked.has(n) && picked.add(n)
).bind(null, new Set))arr.filter((n, i, a) => n === a.find(m => Object.is(m.value, n.value)))
// или
arr.filter((n, i, a) => i === a.findIndex(m => m.value === n.value))Array.from(
new Set(arr.map(n => n.value)),
n => arr.find(m => m.value === n)
)
// или
arr
.slice()
.sort((a, b) => a.value.localeCompare(b.value))
.filter((n, i, a) => n.value !== a[i - 1]?.value)
const newArr = Array
.from(arr.reduce((acc, n) => acc.set(n, (acc.get(n) ?? 0) + 1), new Map))
.filter(n => n[1] === 1)
.map(n => n[0]);arr.splice(0, arr.length, ...Array
.from(arr.reduce((acc, n) => acc.set(n, acc.has(n)), new Map))
.reduce((acc, n) => (n[1] || acc.push(n[0]), acc), [])
);
Знаю, что можно сделать с помощью split и прочими способами,...
str.slice(0, -3).replace(',', '')str.split(':', 2).join(':').split(',').join('')...но нужно элегантное решение
str.replace(/,|.{3}$/g, '')str.replace(/(\d+.\d+.\d+)..(\d+.\d+).*/, '$1 $2')
Math.max(0, ...arr.reduce((acc, n, i, a) => (
n !== a[i - 1] && acc.push(0),
acc[acc.length - 1]++,
acc
), []))arr.reduce((acc, n, i, a) => (
n !== a[~-i] && (acc[1] = 0),
acc[0] = acc[+(++acc[1] > acc[0])],
acc
), [ 0, 0 ])[0]