<div v-for="(row, iRow) in rows" class="board__rows">
<div
v-for="(col, iCol) in columns"
v-text="col + row"
:class="[ [ 'white', 'black' ][(iRow ^ iCol) & 1], 'board__square' ]"
></div>
</div>
React.useCallback((key, val) => {
setData(data => ({
...data,
[key]: val(data[key]),
}));
}, [])
onChange('list', list => list.map((n, i) => i === index
? { ...n, [prop]: value }
: n
))
onChange('description', () => e.target.value)
const filter = (arr, conditions) =>
arr.filter(
function(n) {
return this.every(([ k, values ]) => values.some(v => v.includes(n[k])));
},
Object
.entries(conditions)
.map(n => [ n[0], [].concat(n[1]).map(String) ])
.filter(n => n[1].length)
);
А лучше всего просто объяснить что бы я в итоге допер сам!
const defaultValue = null;
.Предполагаю что надо использовать reduce.
const result = arr1.reduce((acc, n) => (
acc.push(arr2.find(m => m.uniq === +n)?.sum ?? defaultValue),
acc
), []);
const result = [];
for (const n of arr1) {
let item = defaultValue;
for (const m of arr2) {
if (m.uniq == n) {
item = m.sum;
break;
}
}
result[result.length] = item;
}
const sums = Object.fromEntries(arr2.map(n => [ n.uniq, n.sum ]));
const result = (function get(i, n = arr1[i]) {
return i < arr1.length
? [ Object.hasOwn(sums, n) ? sums[n] : defaultValue, ...get(-~i) ]
: [];
})(0);
map
. Это ведь совсем не круто - идти наиболее простым и очевидным путём:const result = arr1.map(function(n) {
return this.has(n) ? this.get(n) : defaultValue;
}, new Map(arr2.map(n => [ `${n.uniq}`, n.sum ])));
Вначале удаляем элемент из массива, затем выбираем новый. Но получается так, что, иногда, выбор случайного элемента массива, происходит до удаления элемента из массива и он выбирает только что удаленный элемент.
Как правильно реализовать такую логику?
useEffect(() => {
dispatch({
type: SET_RND_NUM,
payload: state.arr[Math.random() * state.arr.length | 0],
});
}, [ state.arr ]);
Cannot read properties of undefined (reading 'lastname')
async addNewEmployee({ commit }, employee) { await axios .post(`http://127.0.0.1:8000/api/v1/employees/`, { lastname: employee.lastname,
@submit.prevent="addNewEmployee(employee)"
const { drawImage } = canvas.getContext('2d') as CanvasRenderingContext2D; drawImage( ...
const obj = {
fucking_value: 666,
fucking_method() {
if (!this.hasOwnProperty('fucking_value')) {
throw 'FUCK OFF';
}
console.log(this.fucking_value);
},
};
const { fucking_method } = obj;
fucking_method();
this
- бегом гуглить, разбираться, что это, зачем, к каким значениям в каких случаях даёт доступ.document.querySelector('.form').addEventListener('input', e => {
const data = Array.from(
e.currentTarget.children,
n => Array.from(n.querySelectorAll('input'), m => m.value)
);
document.querySelector('.total').innerText = Array
.from(document.querySelectorAll('.row'))
.reduce((acc, n, i) => {
data[i].forEach((m, j) => n.children[j + 1].innerText = m);
return acc + (+data[i].at(-1) || 0);
}, 0);
});
const total = document.querySelector('.total');
const form = document.querySelector('.form');
const formRows = form.getElementsByClassName('d-flex');
const tableRows = document.getElementsByClassName('row');
form.addEventListener('input', ({ target: t }) => {
const inputBox = t.closest('.input-box');
const formRow = inputBox.parentNode;
const iRow = Array.prototype.indexOf.call(formRows, formRow);
const iCol = -~Array.prototype.indexOf.call(formRow.children, inputBox);
tableRows[iRow].cells[iCol].textContent = t.value;
if (iCol === formRow.children.length) {
total.textContent = Array.prototype.reduce.call(
formRows,
(acc, n) => acc + (n.lastElementChild.children[0].value | 0),
0
);
}
});
const getFromTree = (tree, childrenKey, getter = n => n) =>
Array.isArray(tree)
? tree.flatMap(n => [
getter(n),
...getFromTree(n[childrenKey], childrenKey, getter),
])
: [];
// или
function* flatTree(tree, childrenKey) {
if (
tree instanceof Object &&
tree[Symbol.iterator] instanceof Function
) {
for (const n of tree) {
yield n;
yield* getFromTree(n[childrenKey], childrenKey);
}
}
}
const getFromTree = function(tree, childrenKey, getter = n => n) {
const result = [];
for (const stack = this(tree); stack.length;) {
const n = stack.pop();
result.push(getter(n));
stack.push(...this(n[childrenKey]));
}
return result;
}.bind(x => x instanceof Array ? [...x].reverse() : []);
// или
const flatTree = function*(tree, childrenKey) {
const stack = [];
for (let [ i, arr ] = this(tree); ++i < arr.length || stack.length;) {
if (i === arr.length) {
[ i, arr ] = stack.pop();
} else {
yield arr[i];
stack.push([ i, arr ]);
[ i, arr ] = this(arr[i][childrenKey]);
}
}
}.bind(x => [ -1, x?.constructor === Array ? x : [] ]);
// если использовать обычную функцию
const result = getFromTree(tree, 'children', ({ children, ...n }) => n);
// или, генератор
const result = Array.from(flatTree(tree, 'children'), ({ children, ...n }) => n);
const obj = new Proxy({}, {
get(target, key) {
const lowerKey = key.toLowerCase();
return target[Object.hasOwn(target, lowerKey) ? lowerKey : key];
},
set(target, key, val) {
target[key.toLowerCase()] = val;
return true;
},
has(target, key) {
return key in target || key.toLowerCase() in target;
},
defineProperty(target, key, descriptor) {
return Object.defineProperty(target, key.toLowerCase(), descriptor);
},
deleteProperty(target, key) {
return delete target[key.toLowerCase()];
},
getOwnPropertyDescriptor(target, key) {
return Object.getOwnPropertyDescriptor(target, key.toLowerCase());
},
});
const merge = (key, ...arrs) =>
Object.values(arrs.flat().reduce((acc, n) => (
Object.assign(acc[n[key]] ??= {}, n),
acc
), {}));
const result = merge('id', sum, arr1, arr2);
const merge = (key, ...arrs) =>
Array.from(arrs.reduce((acc, arr) => arr.reduce((acc, n) => {
const k = key(n);
return acc.set(k, Object.assign(acc.get(k) ?? {}, n));
}, acc), new Map).values());
const result = merge(n => n.id, sum, arr1, arr2);
должен быть более лаконичный способ, чем плодить такие переменные
Или это считается нормальной практикой?
const result = arr.map(function(n) {
return this[n];
}, Object.fromEntries(sum.map(n => [ n.id, n.name ])));
// или
const result = arr.map(Map.prototype.get.bind(new Map(sum.map(n => [ n.id, n.name ]))));
// или
const result = arr.map(n => sum.find(m => m.id === n)?.name);
sum
отсутствуют некоторые из нужных элементов, а получать undefined
внутри массива с результатами не хочется?const names = Object.fromEntries(sum.map(n => [ n.id, n.name ]));
const result = arr.map(n => names[n] ?? `объекта с id=${n} нет`);
const names = new Map(sum.map(n => [ n.id, n.name ]));
const result = arr.reduce((acc, n) => ((n = names.get(n)) && acc.push(n), acc), []);
app.ifScroll =
ifScroll.value =
. const containers = document.querySelectorAll('.parent');
const tag = 'div';
const className = 'child';
containers.forEach((n, i) => {
n.insertAdjacentHTML(
'beforeend',
`<${tag} class="${className}">${arr[i]}</${tag}>`
);
});
// или
for (const [ i, n ] of containers.entries()) {
n.append(Object.assign(document.createElement(tag), {
className,
innerText: arr[i],
}));
}
// или
for (let i = 0; i < containers.length; i++) {
const el = document.createElement(tag);
el.classList.add(className);
el.textContent = arr[i];
containers[i].insertAdjacentElement('beforeend', el);
}
// или
(function add(i, n = containers.item(i)) {
if (n) {
n.appendChild(document.createElement(tag));
n.lastChild.setAttribute('class', className);
n.lastChild.insertBefore(new Text(arr[i]), null);
add(-~i);
}
})(0);
const [ checked, setChecked ] = React.useState(false);
<input
type="checkbox"
checked={checked}
onChange={e => setChecked(e.target.checked)}
...
<button
disabled={!checked}
...
нет примера их использования
<q-select
ref="select"
...
<q-btn
@click="$refs.select.showPopup()"
...