const newArr = arr.map(function({ ...n }) {
return this.reduce((acc, k) => (acc[k] = acc[k].toLowerCase(), acc), n);
}, [ 'firstName', 'lastName' ]);
const keys = [ 'firstName', 'lastName' ];
arr.forEach(n => keys.forEach(k => n[k] = n[k].toLowerCase()));
const data = $('table tr')
.get()
.map(tr => $('input', tr).get().map(n => $(n).val()))
.filter(row => row[row.length - 1])
.map(row => `(${row.map(n => `'${n}'`).join(', ')})`);
const data = Array.prototype.reduce.call(
document.querySelector('table').rows,
(acc, { cells, lastElementChild: last }) => (
last.lastElementChild.value && acc.push(`(${Array
.from(cells, n => `'${n.lastElementChild.value}'`)
.join(', ')})`
),
acc
),
[]
);
как-то ограничить по высоте v-app
application--wrap
называется, в стилях которого задана минимальная высота 100vh. Можете переопределить. Как поправить код?
const discounts = [
{ percent: 0, sum: 0 },
{ percent: 2, sum: 4000 },
{ percent: 3, sum: 10000 },
{ percent: 4, sum: 20000 },
{ percent: 5, sum: 50000 },
];
const discount = discounts.reduce((p, c) => c.sum <= pricechange ? c : p);
const discountedPrice = pricechange * (100 - discount.percent) / 100;
const discounts = [
{ percent: 0, sum: 4000 },
{ percent: 2, sum: 10000 },
{ percent: 3, sum: 20000 },
{ percent: 4, sum: 50000 },
{ percent: 5, sum: Infinity },
];
const discount = discounts.find(n => n.sum > pricechange);
<div class="players">
<div class="player">
<input placeholder="*Введите псевдоним" data-type="name">
<br>
<input placeholder="*Введите рейтинг" data-type="rating">
</div>
<div class="player">
<input placeholder="*Введите псевдоним" data-type="name">
<br>
<input placeholder="*Введите рейтинг" data-type="rating">
</div>
</div>
<h1 class="message hidden">HELLO, WORLD!!</h1>
true
или false
:const validations = {
name: val => /\D/.test(val),
rating: val => /^\d+$/.test(val),
};
input
, внутри которого перебираются элементы формы, из них извлекается имя типа данных, по имени типа данных из объекта с валидаторами извлекается функция проверки, ей передаётся значение элемента, введённое пользователем. Чтобы форма в целом была признана корректно заполненной, каждая из проверок должна оказаться успешной, в зависимости от полученного результата показываем или прячем дополнительный контент. Ну и ещё тот элемент, который пользователь только что редактировал, обрабатывается в особом порядке - в зависимости от результата его проверки у него добавляется или снимается класс, предназначенный для выделения некорректно заполненного элемента:document.querySelector('.players').addEventListener('input', function(e) {
const error = Array.from(this.querySelectorAll('[data-type]'), n => {
const error = !validations[n.dataset.type](n.value);
if (n === e.target) {
n.classList.toggle('error', error);
}
return error;
}).some(Boolean);
document.querySelector('.message').classList.toggle('hidden', error);
});
.error {
color: white;
background: red;
}
.hidden {
display: none;
}
const buttons = document.querySelectorAll('.item1');
const targets = document.querySelectorAll('.item2');
const className = 'red';
const updateClass = action => ({ target: t }) => {
const index = Array.prototype.indexOf.call(buttons, t);
if (index !== -1) {
targets[index].classList[action](className);
}
};
const wrapper = document.querySelector('#wrap1');
wrapper.addEventListener('click', updateClass('add'));
wrapper.addEventListener('dblclick', updateClass('remove'));
_react.default.createContext is not a function
гугл советует перейти на 16 версию реакта, но не думаю что это проблема старой версии
"react-redux": "^6.0.0"
React Redux 6.x requires React 16.4 or later.
str.trim().replace(/\s{2,}/g, ' ')
str.split(' ').filter(Boolean).join(' ')
(str.match(/\S+/g) || []).join` `
computed: {
sortedInfo() {
return [...this.info].sort((a, b) => {
// как именно сортировать - тут уж вам виднее
});
},
},
mixin section(props)
-
var allMods = '';
if (typeof(props.mods) !== 'undefined' && props.mods) {
var modsList = props.mods.split(',');
for (var i = 0; i < modsList.length; i++) {
allMods = allMods + ' section--' + modsList[i].trim();
}
}
if props.bg && props.mods
section(class='section' + allMods style="background-image: url('https://source.unsplash.com/MYlCex1M7Ok/1920x200')")
.container
block
section(class='section' + allMods)
.container
block
сначала сделать запрос <...> после чего отрисовать страницу
let state = true;
document.querySelector('button').addEventListener('click', e => {
state = !state;
document.querySelectorAll('circle').forEach((n, i, a) => {
setTimeout(() => {
n.classList.toggle('st0', state);
e.target.disabled = (state ? a.length - i : i + 1) !== a.length;
}, (state ? a.length - i : i) * 3);
});
});
let state = true;
const button = document.querySelector('button');
const circles = document.querySelectorAll('circle');
button.addEventListener('click', () => {
state = !state;
toggleCircle(0);
});
function toggleCircle(i) {
if (i < circles.length) {
setTimeout(() => {
const index = state ? circles.length - i - 1 : i;
circles[index].classList.toggle('st0', state);
button.disabled = i !== circles.length - 1;
toggleCircle(i + 1);
}, 3);
}
}
let state = true;
const circles = document.querySelectorAll('circle');
document.querySelector('button').addEventListener('click', function() {
this.disabled = true;
state = !state;
let i = 0;
const intervalID = setInterval(() => {
const index = state ? circles.length - i - 1 : i;
circles[index].classList.toggle('st0', state);
if (++i === circles.length) {
this.disabled = false;
clearInterval(intervalID);
}
}, 3);
});
файлы записываются все сразу на первой же итерации
const writeFile = (name, data) => new Promise((resolve, reject) => {
fs.writeFile(name, data, function(err) {
if (err) {
reject(err);
} else {
resolve();
}
});
});
const writeFile = require('util').promisify(fs.writeFile);
for (let i = 0; i < iterations; i++) {
await writeFile(`data${i}.txt`, JSON.stringify(obj[i], null, 2));
}