async function loadData() {
const response = await fetch("example.com");
const data = await response.json();
const links = await Promise.all(data.URLs.map(async (url) => {
const urlResponse = await fetch("example.com");
return await urlResponse.json();
}));
setState((prevState) => ({
...prevState,
fetchObject: {
...data,
URLs: links,
},
}));
}
indexOf()
, который возвращает -1
если не найдено, или индекс от 0
и больше.-1
или иное значение. Можно просто сравнивать if (a.indexOf(b) > -1) { /* найдено! */ }
но иногда хочется короче.~
хорош тем, что выделяет -1
: только -1
с этим оператором даст 0
. Прочие числа дадут какое-то ненулевое значение.~(-1) === 0
0
и больше получилось тоже ненулевое число, и !!
даст true
-1
получится уникальный 0
, и !!0
вернёт false
Object.values(Object.fromEntries(arr.map(n => [ n.user.id, n ])))
// или, если в результирующий массив должны попадать те из "одинаковых" элементов,
// что расположены в исходном массиве первыми
Object.values(arr.reduce((acc, n) => (acc[n.user.id] ??= n, acc), {}))
// или, если также надо сохранять взаимное расположение элементов
arr.filter(function({ user: { id: n } }) {
return !(this[n] = this.hasOwnProperty(n));
}, {})
function* unique(data, key = n => n) {
const getKey = key instanceof Function ? key : n => n[key];
const keys = new Set;
for (const n of data) {
const k = getKey(n);
if (!keys.has(k)) {
keys.add(k);
yield n;
}
}
}
const result = [...unique(arr, n => n.user.id)];
.Array.from(unique([{id: 1}, {id: 2}, {id: 1}, {id: 1} ], 'id')) // [{id: 1}, {id: 2}]
''.concat(...unique('ABBACACCCBA')) // 'ABC'
.for (const n of unique(Array(20).keys(), n => Math.sqrt(n) | 0)) {
console.log(n); // 0 1 4 9 16
}
const first = document.querySelector('.listing');
const tag = 'p';
const arr = [...'ABCDEF'];
first.after(...arr.map(n => {
const el = document.createElement(tag);
el.innerHTML = n;
return el;
}));
// или
first.replaceWith(first, ...arr.reduce((acc, n, i) => (
(acc[i] = document.createElement(tag)).innerHTML = n,
acc
), []));
// или
arr.reduce((prev, n) => (
prev.insertAdjacentElement('afterend', document.createElement(tag)),
prev.nextSibling.innerHTML = n,
prev.nextSibling
), first);
// или
const parent = first.parentNode;
const nodes = parent.childNodes;
arr.forEach(function(n) {
const el = document.createElement(tag);
el.innerHTML = n;
parent.insertBefore(el, nodes[++this[0]]);
}, [ Array.prototype.indexOf.call(nodes, first) ]);
// или
first.insertAdjacentHTML(
'afterend',
arr.map(n => `<${tag}>${n}</${tag}>`).join('')
);
В каком форуме можно предложить разработчикам эту идею?