// имена свойств можно передавать в виде массива
const pick = (obj, keys) => Object.fromEntries(keys.map(n => [ n, obj[n] ]));
const newObj = pick(obj, [ 'b', 'c' ]);
// или как отдельные значения
const pick = (obj, ...keys) => keys.reduce((acc, n) => (acc[n] = obj[n], acc), {});
const newObj = pick(obj, 'b', 'c');
const pickExisting = (obj, keys) =>
Object.fromEntries(keys.filter(n => n in obj).map(n => [ n, obj[n] ]));
const pickOwn = (obj, keys) =>
keys.reduce((acc, n) => (Object.hasOwn(obj, n) && (acc[n] = obj[n]), acc), {});
const pick = (obj, filterFn) => Object.fromEntries(Object.entries(obj).filter(filterFn));
const obj1 = pick(obj, ([ k, v ]) => 'abc'.includes(k) && v % 2); // {a: 1, c: 3}
const obj2 = pick(obj, n => n[1] > 2); // {c: 3, d: 5}
nextSlide() {
---> nextSlide = () => {
.onclick = this.nextSlide;
---> .onclick = () => this.nextSlide();
.onclick = this.nextSlide;
---> .onclick = this.nextSlide.bind(this);
this
. str.split(/(?<=\S)\s*(?=[А-ЯЁ])/).join(' ')
// или
str.replace(/(?<=\S)(?=[А-ЯЁ])/g, ' ')
// или
str.replace(/(\S)(?=[А-ЯЁ])/g, '$1 ')
// или
str.replace(/[А-ЯЁ]/g, (m, i) => i && str[~-i] !== ' ' ? ' ' + m : m)
.filter(function (el, i) { return arr[i] === el[i]; })
0
? Или 5
? А зачем тогда [i]
? Может, должно было быть arr[i] === el
? const searchOptions = [
[ '#search_table', tr => $('input[name^=name]', tr).val() ],
[ '#search_card', tr => $('[data-item-name="name"]', tr).text() ]
];
$(searchOptions.map(n => n[0]).join(', ')).on('input', () => {
const values = searchOptions.map(n => $(n[0]).val().toLowerCase());
$('#tabname tbody tr')
.hide()
.filter((i, n) => searchOptions.every((m, j) => m[1](n).toLowerCase().includes(values[j])))
.show();
});
const sorted = (arr, key) => arr
.map(n => [ key(n), n ])
.sort(([a], [b]) => a < b ? -1 : +(a > b))
.map(n => n[1]);
const sortedArr = sorted(arr, n => new Date(n.replace(/(\d+)\.(\d+)\.(\d+),/, '$3-$2-$1')));
// или
const sortedArr = sorted(arr, n => n.replace(/.+(?=,)/, m => m.split('.').reverse().join('')));
`${arr}`.match(/\b\w{5}\b/g) || []
// или
arr.reduce((acc, n) => (n.length ^ '0b101' || acc.push(n), acc), [])
// или
arr.filter(n => n[4] && !n[-~4])
// или
arr.filter(RegExp.prototype.test.bind(/^.....$/))
// или
arr.reduce((acc, n) => ((acc[n.search('$')] ??= []).push(n), acc), {})[5] ?? []
// или
(function xxx(arr, i = 0) {
return arr.hasOwnProperty(i)
? [].concat(5 - [].push(...arr[i]) ? [] : arr[i], xxx(arr, i + 1))
: [];
})(arr)
instanceof Object
.true
или false
.function getNestedData(data, test) {
const result = [];
for (const stack = [ data ]; stack.length;) {
const n = stack.pop();
if (n instanceof Object) {
stack.push(...Object.values(n).reverse());
}
if (test(n)) {
result.push(n);
}
}
return result;
}
console.log(getNestedData(tree, Number.isFinite));
const firstNonRepeatingLetter = ([...str]) => Object
.values(str.reduce((acc, n, i) => ((acc[n.toLowerCase()] ??= [ 0, i, n ])[0]++, acc), {}))
.reduce((min, n) => (n[0] === 1 && n[1] < min[1] ? n : min), [ 0, Infinity, '' ])
.pop();
const firstNonRepeatingLetter = str =>
str.charAt(Array
.from(str.toLowerCase())
.findIndex((n, i, a) => a.indexOf(n) === a.lastIndexOf(n))
);
async function() {
let result = null;
while (1) {
result = await fetch(...);
if (result тот, который нужен) {
break;
}
await new Promise(r => setTimeout(r, 5000));
}
return result;
}
const sum = data =>
Array.isArray(data)
? data.reduce((acc, n) => acc + sum(n), 0)
: (+data || 0);
function sum(data) {
let result = 0;
for (const stack = [ data ]; stack.length;) {
const n = stack.pop();
if (n instanceof Array) {
stack.push(...n);
} else {
result += +n || 0;
}
}
return result;
}
true
, '0xBB'
, { valueOf: () => 666 }
и т.д.Странно, но все работает, несмотря на ошибку:
TypeError: Cannot read properties of null (reading 'insertAdjacentHTML').
arr.forEach(n => {
const el = document.getElementById(n.id);
if (el) {
el.innerHTML = `
<h2>Id: ${n.id}</h2>
<h3>${n.title}</h3>
<p>${n.body}</p>
`;
}
});
for (const { id, title, body } of arr) {
document.querySelector(`[id="${id}"]`)?.insertAdjacentHTML('beforeend', `
<h2>Id: ${id}</h2>
<h3>${title}</h3>
<p>${body}</p>
`);
}
section
изначально будет пустым):document.querySelector('section').innerHTML = arr
.map(n => `
<div id="post-${n.id}">
<h2>Id: ${n.id}</h2>
<h3>${n.title}</h3>
<p>${n.body}</p>
</div>`)
.join('');
const limit = document.querySelector('section').children.length;
const requestURL = `https://jsonplaceholder.typicode.com/posts?_limit=${limit}`;
const requestURL = 'https://jsonplaceholder.typicode.com/posts?' + Array
.from(document.querySelector('section').children, n => `id=${n.id}`)
.join('&');
const elements = document.querySelectorAll('[name^=AR_AMOUNT]');
const sum = Array.prototype.reduce.call(
elements,
(acc, n) => acc + +n.value,
0
);
// или
let sum = 0;
for (const { value } of elements) {
sum += Number(value);
}
0
:const sum = (function sum(arr, i) {
return arr[i] ? parseFloat(arr[i].value) + sum(arr, i + 1) : 0;
})(elements, 0);
+
, в строку; строку отдаём в eval
; всё, сумма получена (ну, почти, если исходная коллекция элементов была пуста, то строка тоже будет пустой, так что надо не забыть подставить 0
вместо возможного undefined
, который является результатом выполнения пустой строки):const sum = eval(Array.from(elements, n => n.value).join('+')) ?? 0;
const merge = (target, ...sources) =>
sources.reduce((acc, n) => (
Object.entries(n).forEach(([ k, v ]) =>
acc[k] = v instanceof Object
? merge(acc[k] instanceof Object ? acc[k] : {}, v)
: v
),
acc
), target);
const result = merge({}, ...arrayObj);
const sorted = (data, key) => Array
.from(data, n => [ key(n), n ])
.sort(([a], [b]) => a < b ? -1 : +(a > b))
.map(n => n[1]);
const sortChildren = (el, key) =>
el.append(...sorted(el.children, key));
<button data-order="-1">От большего к меньшему</button>
<button data-order="+1">От меньшего к большему</button>
.catalog-items
(вес элемента - число внутри, умноженное на направление сортировки), кликнутой кнопке класс добавляем, у остальных убираем:const wrapper = document.querySelector('.catalog-items');
const buttons = document.querySelectorAll('[data-order]');
buttons.forEach(n => n.addEventListener('click', onClick));
function onClick({ target: t }) {
const order = +t.dataset.order;
sortChildren(wrapper, el => parseInt(el.innerText) * order);
buttons.forEach(n => n.classList.toggle('active', n === t));
}
const [ zero, one, two, three, four, five, six, seven, eight, nine ] = Array.from(
{ length: 10 },
(_, i) => f => f instanceof Function ? f(i) : i
// или
// (_, i) => f => f?.(i) ?? i
);
const plus = a => b => b + a;
const minus = a => b => b - a;
const times = a => b => b * a;
const dividedBy = a => b => b / a | 0;
const sortDigits = num => +[...`${num}`].sort((a, b) => b - a).join('');
const sortDigits = num => ''.concat.apply('', num.toString().split('').sort().reverse()) - 0;
const sortDigits = num => Number(Array
.from('' + num)
.reduce((acc, n) => (acc[n]++, acc), Array(10).fill(0))
.reduceRight((acc, n, i) => acc + String(i).repeat(n), '')
);
const sortDigits = num => Array
.prototype
.reduce
.call(String(num), (acc, n) => ((acc[9 - n] ??= []).push(n | 0), acc), [])
.flat()
.reduce((acc, n) => acc * 10 + n, 0);