package.json
находятся на хосте в текущей папке.docker run -it --rm -v "$PWD":/usr/src/app -w /usr/src/app node npm install
docker run \
-it \ // интерактивно и с терминалом
--rm \ // удалить контейнер после выхода
-v "$PWD":/usr/src/app \ // текущую папку на хосте смонтировать в контейнер
-w /usr/src/app \ // в конт. сделать текущей папкой смонтированную
node \ // образ с nodejs
npm install // команда
var a = 'QnA.habr.com';
Object.defineProperty(this, 'a', {
set: function(v) {console.log('Изменяют!'); this.value = v;},
value: 'QnA.habr.com'
});
то теперь любое изменение значения переменной вызовет панику в консоли:a = 'StackOver...';
// Изменяют!
volumes:
db-data:
external: true
- db-data в данном примере этот каталог расположенный в одной директории с docker-compose.yml?Нет. Это именованный volume. Его фактическая папка спрятана где-то глубоко, можно посмотреть командой
docker volume inspect db-data
и изначально он пустой.В чем отличие от такой записи(является ли она корректная?):Такая запись первым параметром указывает не именованный volume, а подпапку в папке с- ./db-data:/var/lib/mysql/data
docker-compose.yml
Т.е. mysql получит папку со всем её содержимым по адресу, указанному вторым параметром.let arr = [1,3,3,4,5,5,5];
function count(arr){
let cnt = 1; // один счётчик на все значения?
let map = new Map();
for(let i = 0; i< arr.length; i++){
for(let j = 0; j< arr.length; j++){ // плохо, что на каждый элемент весь массив перебираете
// получается, считаются все пары одинаковых на каждом проходе.
if(arr[i] == arr[j]){ // здесь каждый раз найдётся равенство самому себе
map.set(arr[i],cnt++); // а общий счётчик всё больше и больше
}
}
} return map;
}
console.log(count(arr));
let arr = [1,3,3,4,5,5,5];
function count(arr){
const map = new Map();
const len = arr.length;
for (let i = 0; i < len; i++) {
const value = arr[i];
if (!map.get(value)) map.set(value, 0); // создать счетчик
map.set(value, map.get(value) + 1); // увеличить на 1
}
return map;
}
console.log(count(arr));
/*
Map(4)
size: 4
<entries>
0: 1 → 1
1: 3 → 2
2: 4 → 1
3: 5 → 3
*/
<?=
не просто выполняет код внутри него, но и выводит результат.<?php echo
<?= require_once...
на <? require_once...
Но такой короткий тег <?
не всегда поддерживается и не рекомендуется.<?php
require_once APP . '/views/App/inc/header.php';
echo $content;
require_once APP . '/views/App/inc/footer.php';
?>
catalogList
name
, можно создать объект, где это свойство будет ключом, а последний встретившийся объект с этим свойством – значением. Более поздние объекты с повторным свойством name
перезаписывают собой более ранние. В конце остаётся вытащить все значения из этого объекта:Object.values(
arr.reduce(
(acc, c) => {
c.forEach(o => acc[o.name] = o);
// получается объект acc:
// "test": {id: 1, name: 'test'},
// "test2": {id: 2, name: 'test2'},
// "test3": {id: 3, name: 'test3'},
// ...
return acc;
},
{}
)
);
{"name": "Stan", code: "dart"}
и {"name": "Stand", code: "art"}
— оба дадут отпечаток "Standart"
и посчитаются идентичными.id
, и перевести в JSON. Тут слабое место – порядок свойств. Если у одного из объектов свойства поменяют местами, алгоритм сочтёт их разными.Object.values(
arr.reduce(
(acc, c) => {
c.forEach(o => {
const source = Object.assign({}, o);
delete source.id;
const hash = JSON.stringify(source);
acc[hash] = o;
});
return acc;
},
{}
)
);
filterSelectChildren()
DOM ещё не обновлён и таблицы нет.Vue.nextTick(function () {
filterSelectChildren('#codepenSelectFirstChild', currentSetting);
})
i
после обновления.i++, i++ // i === 2
i===2
(0, 1, 2 - т.е. третий, он и так пока скрыт). i===1
(т.е. второй, был видимым).0
. Остался видимым нулевой.i--
на --i
.i
может уезжать в минус.const divs = document.querySelectorAll('div')
const length = divs.length;
const btnShow = document.querySelector('.show')
const btnHide = document.querySelector('.hide')
function showVisible(visible) {
const toShow = Math.min(visible, length);
for (let i=0; i < length; i++) {
divs[i].style.display = i < toShow ? 'block' : 'none';
}
}
let visible = 0;
showVisible(visible);
btnShow.addEventListener('click', function () {
visible = Math.min(visible + 2, length);
showVisible(visible);
});
btnHide.addEventListener('click', function () {
visible = Math.max(visible - 2, 0);
showVisible(visible);
});
function(){...}
, а выражение users.sort(...)
button.addEventListener('click', function() {
users.sort(
function(a, b){
return b.age-a.age
}
)
});
// или покороче
button.addEventListener('click', () => users.sort((a, b) => b.age - a.age));
Так только по событию клика массив, наконец, отсортируют. function hasCyclicRef($subject) {
return FALSE === strpos(serialize($subject), 'R:');
}
$arr = (object) ['one' => 1, 'two' => 2];
$arr->me = &$arr;
var_dump( hasCyclicRef($arr));