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));
DATE(NOW()) <= date_end AS isActive
CASE TRUE
WHEN date_end >= DATE_ADD(NOW(), INTERVAL 1 WEEK))
AND date_end < DATE_ADD(NOW(), INTERVAL 1 MONTH)) THEN "через месяц"
WHEN date_end >= DATE_ADD(NOW(), INTERVAL 1 DAY))
AND date_end < DATE_ADD(NOW(), INTERVAL 1 WEEK)) THEN "через неделю"
...
END AS kogda
и подобными (a + 0*k) + (a + 1*k) + (a + 2*k) + ... + (a + (N-1)*k)
= a * N + ( 0*k + 1*k + 2*k + ... (N-1)*k )
= a * N + k * (0 + 1 + 2 + ... (N-1))
= a * N + k * (N * (N - 1) / 2 )
Получилась формула для искомой суммы.a + N*k > b
var N = 1 + Math.floor((b-a) / k);
// элементы
const in_1 = document.getElementById("input_1");
const in_2 = document.getElementById("input_2");
const btn = document.getElementById("btn");
// функция проверки и вкл/выкл кнопки
const check = () => btn.disabled =
in_1.value.length < 3 || in_2.value.length < 3;
// проверять при изменении инпутов
in_1.addEventListener('input', check);
in_2.addEventListener('input', check);
// проверить разок в самом начале
check();