const onClick = event => {
const nodeList = document.querySelectorAll('.item');
for (let i=0; i<nodeList.length; i++ ) {
nodeList[i].style = (nodeList[i] === event.target ? 'background:red' : 'background:green');
};
}
.item {background: green } // по умолчанию все зелёные
.item-red {background: red } // тот самый
// clickedEl — item, по которому кликнули
[...document.querySelectorAll('.item')].forEach(el => {
if (clickedEl === el) el.classList.add('item-red');
else el.classList.remove('item-red');
});
while()
и не for()
— может, прокатит?// случайные:
const myArray = [...Array(3)]
.map(
row =>
[...Array(3)]
.map(
el => Math.floor(Math.random() * 10)
)
)
;
// диагональ, где оба индекса равны:
const diagonal = myArray
.map(
(row, rowIndex) =>
row
.map(
(el, elIndex) => rowIndex === elIndex ? 1 : 0
)
)
;
/**
* асинхрота с запросом. Возвращает Promise
*/
const doAsyncStuff = (urlIter, urlSite) => new Promise((resolve, reject) => {
needle.get(urlIter, (err, result) => { // Сама асинхронная функция
if (err) reject(err);
$('.product-card__link')
.each((i, val) => prodLink.push(urlSite + $(val).attr("href")));
resolve();
})
})
/**
* Тот самый цикл
* @param {number} quanPage число страниц
*/
const doStuff = async quanPage => {
for(let i = 1; i <= quanPage; i++) {
let urlIter = urlSite + i; // Ссылка, которая создается с каждой новой итерацией
await doAsyncStuff(urlIter, urlSite); // Ждём-с!
}
}
doStuff(10);
if(check){
if(true || check) { // временно убрали проверку заполнения всех полей. TODO убрать костыль
function sub(form_id){
$("#img_loader").val($("#files").find("img").attr("src"));
$.ajax({
type: 'POST',
url: '/php.php',
data: $('#'+form_id).serialize(),
success: function(data) {
$("#recall_wrapper").html("<p class='title_recall'>Ваш отзыв успешно отправлен</p>");
setTimeout(() => window.location.href='/recalls_ok.htm', 1000); // перекидывать не сразу, а через 1 сек
},
error: function(xhr, str){
$("#status__send").text('Возникла ошибка: ' + xhr.responseCode);
}
});
}
FooSearchComponent
, в который через props из родителя передаём реактивное свойство foo
:Vue.component(
"FooSearchComponent",
{
props: ['foo'],
template: '<div>
<a
href="#"
@click="searchFoo(foo)"
>
{{ foo }}
</a>
</div>',
methods: {
searchFoo: function(search) {
console.log("searchFoo:", search);
},
}
}
);
searchFoo()
в который параметром передаётся свойство (реактивное, извне) foo
// ...
$('input').each(function (index) {
$(this).val(decode[index]);
});
0, 1, 2, ...
И если разметка документа не менялась, можно надеяться, что порядок найдённых input'ов будет тот же, что и при сохранении значений. Способ не гарантирует попадание значения в нужный input, но в простом случае упражнения сработает.id
и сохранять их вместе со значениями. При восстановлении обращаться к элементам по id
. lodash
пишут в документации Sails:Async (async
) and Lodash (_
)
Sails also exposes an instance of lodash as_
, and an instance of async asasync
. These commonly-used utilities are provided by default so that you don't have to npm install them in every new project. Like any of the other globals in sails, they can be disabled.
globals.js
предназначен только для отключения некоторых глобалов-по-умолчанию:// config/globals.js
module.exports.globals = {
_: false,
async: false,
models: false,
services: false
};
_: require('lodash')
воспринимается, видимо, так же, как и _: true
– т.е. просто не-запрещает эту глобальную переменную.let one = ['one', 'two', 'three', 'four', 'five'];
let two = ['a', 'b', 'five', 'c', 'one'];
const [long, short] = one.length > two.length ? [one,two] : [two,one];
short.sort();
const shortLength = short.length;
const binSearch = needle => {
let start = 0, finish = shortLength - 1;
while (start <= finish) {
const center = Math.floor((start + finish) / 2);
if (short[center] < needle) start = center + 1;
else if (short[center] > needle) finish = center - 1;
else return true;
}
return false;
}
const result = [];
for (let i = 0, length = long.length; i < length; i++)
if (binSearch(long[i])) result.push(long[i]);
result // ["five","one"]
возраст 6 бит, количество курсов 3 бита
0 пол
1 семейное положение (женат / не женат)
2–7 возраст (6 бит запишут значения 0..63 точно хватит?)
8–10 количество курсов
11 присутствие
const encode = (sex, family, age, classes, presence) =>
(1 & sex) << 0 |
(1 & family) << 1 |
(63 & age) << 2 |
(7 & classes) << 8 |
(1 & presence) << 11
;
const decode = n => ({
sex : n >> 0 & 1,
family : n >> 1 & 1,
age : n >> 2 & 63,
classes : n >> 8 & 7,
presence : n >> 11 & 1,
});
неженатых женщин, с возрастом от 25 до 30 включительно, без курсов и с присутствием.
const mask = encode(1, 0, 25, 0, 1);
data.filter(n => n === mask); // нужно полное равенство маски и числа, как я понял?
data.filter(n => (n & 0xFFF) === mask);
const masks = [];
for(let i=25; i<=30; i++) masks.push( encode(1, 0, i, 0, 1));
data.filter(n => masks.includes(n & 0xFFF));
let i = 0; // i = 0
while (i++ < 5) { // i = 0 сравнивают с 5. Меньше. Ок.
// После этого i стало = 1
alert( i ); // вывели 1
}
// следующая итерация
while (i++ < 5) { // i = 1 сравнивают с 5. Меньше. Ок.
// После этого i стало = 2
alert( i ); // вывели 2
// следующие итерации
// i = 2 -> 3
// i = 3 -> 4
// i = 4 -> 5
// следующая итерация
while (i++ < 5) { // i = 5 сравнивают с 5. Не меньше. Равно. Не ок!
// вышли из цикла
optimization: {
minimizer: [
new UglifyJsPlugin({
sourceMap: true
})
]
},
const customObj = (({ second, third }) => ({ second, third }))(obj);
const obj = {
first: 123,
second: 154,
third: 654,
fourth: 993
};
const customObj = (({ second, third }) => ({ second, third }))(obj);
customObj // { second: 154, third: 654 }
js я вообще не знаю. просто решил попробовать изучать по мере выполнения задачЭто не та задача, с которой стоит начинать изучение JS.
function declOfNum(number, titles) {
cases = [2, 0, 1, 1, 1, 2];
return titles[ (number%100>4 && number%100<20)? 2 : cases[(number%10<5)?number%10:5] ];
}
// использование: в массиве передавать формы для 1, 4 и 5 «штук»
declOfNum(count, ['найдена', 'найдено', 'найдены']);
srcconst total = 10;
const totalWords = ['упражнения', 'упражнений', 'упражнений'];
const newTotal = 'Составить тренировку из ' + total + ' ' + declOfNum(total, totalWords);
lib/defaults.js
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.common['Authorization'] = NEW_TOKEN;
axios.get('https://google.com').then(r => console.log(r));
Array.of()
позволяет привязать контекст, иной, нежели Array
.function Stack(){}
Stack.prototype = Object.create(Array.prototype);
Stack.prototype.last = function(){return this[this.length-1]}; // вернуть последний элемент
const testArr = Array.of.call(Stack, 1, 2, "три!");
.last()
console.log(testArr.last()); // "три!"