var src = ["груша", "яблоко", "апельсин", "груша", "банан", "груша", "апельсин"];
var dict = src.reduce( function(p,c){
if( p.hasOwnProperty(c)) p[c]++;
else p[c] = 1;
return p;
}, {});
// теперь нужно вывести dict в порядке убывания значений:
// создать массив объектов с двумя полями: слово и число
// и отсортировать его по убыванию поля с числом.
var arr = [], word;
for( word in dict) arr.push({ w: word, n: dict[word] });
arr.sort( function(a,b){ return b.n - a.n });
// массив arr теперь отсортирован правильно, осталось вывести:
for( var i = 0; i < arr.length; i++) console.log( arr[i].w +' - '+ arr[i].n );
A.then(B).then(C)
:$("#button").click( animate );
function animate() {
number1().then( number2).then( number3);
}
function number1() { // асинхронная, вернет промис
return $('p').each( function(i) { $(this).delay((i++) * 500).fadeTo(2000, 1)} )
.promise();
}
function number2() { // асинхронная, вернет промис
return $('p').hide("fast").promise();
}
function number3() { // выполнится мгновенно
$('#result').html("Hello World");
}
complete
$("#button").click( number1 );
function number1() {
var $p = $('p'), len = $p.length;
$p.each(function(i) {
$(this).delay((i++) * 500).fadeTo(2000, 1, function(){
if(i===len) $( "p" ).hide( "fast", number2); // выполнить только для последнего из всех
});
})
}
function number2() {
var number2func = document.getElementById('result');
number2func.innerHTML = "Hello World";
}
$(".image-portfolio").on( 'click', function(){
window.dispatchEvent(
new CustomEvent( 'sect', { detail: $(this).data("section")} )
);
});
// где-то далеко далеко ловим данные из события
window.addEventListener('sect', function(e) {
$('body').append('<div>кликнули на ' + e.detail + '</div>');
});
function trimmer(n) {
var s = n.toString(), pos = s.indexOf('.');
return parseFloat( s.substr( 0, !!~pos ? pos+4 : s.length));
}
trimmer(32.0123456) // 32.012
trimmer(32.000000001) // 32
trimmer(32.1000000001) // 32.1
trimmer(32) // 32
trimmer(.001) // 0.001
trimmer(32.987654) // 32.987
trimmer(32.9999999999) // 32.999
parseFloat( (32.3).toFixed(3)) // 32.3
parseFloat( (32.12345).toFixed(3)) // 32.123
parseFloat( (32.98765).toFixed(3)) // 32.988
parseFloat( (32.99999).toFixed(3)) // 33
<div>
с каким-то содержимым, которое вы хотите «закодировать».function encode(s) {
var i, out = [];
for(i=0;i<s.length;i++) out.push(s.charCodeAt(i));
return out.join('!');
}
var button = document.getElementById('btn');
function f1() {
button.disabled = true;
button.onclick = todo.shift(); // заменили обработчик на следующий из очереди
var timeoutID = setTimeout( /* запуск таймера */
function() { button.disabled = false},
1000
);
}
var todo = []; // очередь одноразовых задач
todo.push(f1,f1,f1); // три раза f1, потом добавьте "другие" - f2, f3
button.onclick = todo.shift(); // зарядить первую
list-group-item
:document.body.addEventListener('click', function(e) {
if( e.target.classList.contains('list-group-item'))
e.target.style.backgroundColor = 'red';
});
<body>
можно повесить слушателя ниже, например, на <ul>
, чтобы ловить события только в его дочерних элементах (и глубже). for(let key,i=0;i<localStorage.length;i++) key=localStorage.key(i),console.log(key,':', localStorage.getItem(key));
const L=localStorage;for(let k,v,i=0;i<L.length;i++) {k=L.key(i);try{v=JSON.parse(L.getItem(k)).name}catch(e){};console.log(k,' => ',v)}
function pairs( arr) {
var result = {};
for( var i = 1; i<arr.length; i+=2) result[ arr[i-1]] = arr[i];
return result;
}
pairs(["item1","black","item2","black","item3","black","item4","black","item5","black"]) // {
"item1": "black",
"item2": "black",
"item3": "black",
"item4": "black",
"item5": "black"
}
contents()
input
, а не клавиатурные.var curNode
, startOffset
, arrIN = ['--','<<','>>','->','<-']
, arrOUT = ['—','«','»','→','←']
;
arrIN = arrIN.map(function(s){ return new RegExp(s,'g')});
$('#edit').on('input', onInput);
function onInput() {
var selObj = window.getSelection()
, range = selObj.getRangeAt(0)
;
curNode = range.startContainer;
startOffset = range.startOffset;
$(this).contents().each(walk);
range.setStart(curNode, startOffset);
}
function walk(i, node){
var len
, diff
;
if( node.nodeType === Node.TEXT_NODE) {
len = node.textContent.length;
node.textContent = replacer(node.textContent);
diff = len - node.textContent.length;
if( node === curNode && diff) {
startOffset -= diff;
}
} else if( node.nodeType === Node.ELEMENT_NODE) {
$(node).contents().each(walk);
}
}
function replacer(s) {
var i;
for( i = 0; i < arrIN.length; i++) s = s.replace( arrIN[i], arrOUT[i]);
return s;
}
var active = undefined; // здесь будет jQuery( активный пункт )
var $sortable = $('a.sortable'); // пунктов с сортировкой потом может быть больше 1
$sortable.data('sort', true); // true == asc, false == desc
$('a.clickme').on('click', function() {
var $el = $(this);
$sortable.removeClass('asc').removeClass('desc'); // у всех убрать сортировку
if( $el.hasClass('sortable')) { // кликнули переключаемый пункт
if( active && $el[0] === active[0]) { // он был уже активен
$el.data('sort', !$el.data('sort')); // изменили сортировку на другую
$el.addClass( $el.data('sort') ? 'asc' : 'desc') // переключили классы соотв.
.removeClass( $el.data('sort') ? 'desc' : 'asc');
} else {
$el.addClass( $el.data('sort') ? 'asc' : 'desc'); // просто добавили правильный класс
}
}
if( active) active.removeClass('active'); // выключить предыдущий активный эл.
active = $el.addClass('active'); // включить активность кликнутого
});
ar.length = 0
var ar = [1, 2, 3];
ar.sum = function() {
return this.reduce(function(a, b) {
return a + b;
});
}
ar.length = 0; // значений больше нет, но метод sum() остался
ar.push(5, 6, 7); // добавляем новые значения
ar.sum() // 18
if .. else
continue
или return
потому, что это не выражения, принимающие какие-то значения, а управляющие структуры.return isItTrue ? A : B;
return
и continue
годится только старый добрый if .. else