arr2 = arr2.filter(e => !~arr.indexOf(e));
// facebook.com,ya.ru
~
которое даст 0 в единственном случае, когда операнд равен -1. Его отрицание !
даст true в том же единственном случае. Итого эта функция вернёт true только, если элемент не найден в массиве arr. function test(varbl) {
varbl = varbl || 0;
alert(varbl);
}
test();
test( 100500);
var varbl;
if( Math.random() > 0.5) varbl = 100500;
&&
принимает значение true
в единственном случае – если оба операнда true
.a && b
проверяет по очереди: сначала, приводится ли к значению true
первый операнд, a
? Если нет, то дальше проверять нет смысла и выражение возвращает первый операнд, а
.a
не пустой и при переводе в логическое true | false даёт таки true
, то так же проверяется второе выражение, b
.jj(false)
.return +a[attr] > +b[attr] ? 1: -1;
return +a[attr] - b[attr];
const sortFunc = function sortFunc(data, elem) {
switch( elem.getAttribute('name')) {
case 'id':
case 'salary':
data.sort((a, b) => +a[attr] - b[attr]);
break;
case 'user':
case 'position':
case 'gender':
data.sort((a, b) => a[attr] > b[attr] ? 1 : (a[attr] < b[attr] ? -1 : 0));
break;
default:
throw('Bad attribute');
}
};
00 01 02
10 11 12
20 21 22
00 : 0+0 = 0
10, 01 : 1+0 = 0+1 = 1
20, 11, 02: 2+0 = 1+1 = 0+2 = 2
var arr = [
'o,x,x'.split(','),
'x,o,o'.split(','),
'o,x,o'.split(','),
];
var r, c, key, diags = {};
for(r = 0; r < arr.length; r++) {
for(c = 0; c < arr[r].length; c++) {
key = r + arr[r].length - 1 - c; // слева сверху вправо вниз
// key = r + c; // слева снизу вправо вверх
if( diags.hasOwnProperty(key)) {
if( diags[key] !== arr[r][c]) diags[key] = false;
} else {
diags[key] = arr[r][c];
}
}
}
for( key in diags) if( diags[key] === false) delete diags[key];
// {"0":"x","2":"o","3":"x","4":"o"}
user_params()
отработает сразу и вернет null. А ответ от ВК будет получен когда-то потом и попадёт во вложенную функцию.function user_params(id, param, callback) {
vk('users.get', {user_ids: id, fields: param}, function(error, response){
if (error) {
console.log(error);
} else callback(response[0][param]);
});
};
function roundTS(ts) {
var D = new Date(ts);
var m = 15 + Math.ceil( D.getMinutes() / 15);
D.setMinutes(m);
return D.getTime();
}
function roundMinArr( D, arr) {
var i, m = D.getMinutes();
arr.sort((a,b)=>a-b);
for(i in arr) {
if( arr[i] < m) continue;
D.setMinutes(arr[i]);
return D;
}
D.setMinutes(60 + arr[0]);
return D;
}
var D = roundMinArr( new Date('2017-08-16T12:17+03:00'), [0,15,35,44,59]);
D.toString() // Wed Aug 16 2017 12:35:00 GMT+0300 (MSK)
this.a=[
new Audio('https://wav-library.net/sfx/mix/LightSwitch.mp3'),
new Audio('https://wav-library.net/prmusic/rock/Run.mp3')
];
this.f=()=>{ // это будет новый обработчик клика
var cc=!!this.cc; // для краткости записи
this.a[+!cc].pause(), // если предыдущий длинный играет - стоп его!
this.a[+!cc].currentTime=0, // ..и перемотать на начало.
a[+cc].play(), // играть новый
this.cc=!cc // переназначить счётчик ( true | false )
};
this.onclick=this.f, // переназначить хэндлер клика
this.f() // вызвать для первого клика принудительно
<td onclick="this.a=[ new Audio('https://wav-library.net/sfx/mix/LightSwitch.mp3'), new Audio('https://wav-library.net/prmusic/rock/Run.mp3')];
this.f=()=>{var cc=!!this.cc;this.a[+!cc].pause(),this.a[+!cc].currentTime=0,a[+cc].play(),this.cc=!cc};
this.onclick=this.f,this.f()">click me!</td>
function getById( obj, id) {
var i, found;
if( obj.id === id) return obj;
if( obj.hasOwnProperty('childGroups')) {
for( i in obj.childGroups) {
if( found = getById( obj.childGroups[i], id)) return found;
}
}
return;
}
getById( obj,3) // {"id":3,"parentId":1,"childGroups":[{"id":6,"parentId":3},{"id":7,"parentId":3}]}
function bad( obj, name) {
return eval('obj.' + name);
}
bad(r, 'foo.bar'); // 'value'
function better( obj, name) {
var parts = name.split('.'), i, cursor = r;
for( i = 0; i < parts.length; i++) {
if( !cursor.hasOwnProperty( parts[i])) throw('No such property: ' + parts[i]);
cursor = cursor[parts[i]];
}
return cursor;
}
better(r, 'foo.bar'); // 'value'
<div class="textfield" contentEditable="true">напиши-ка!
</div>
.textfield {
font-size:16px;
color:white;
min-height:16px;
line-height:20px;
width:200px;
border:1px solid #999;
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACtJREFUeNpiNDY2ZiAXMDFQAEY1j2oe1TyoNLNoOu0nX/P1fY4D42yAAAMA7aYDxR1GwC8AAAAASUVORK5CYII=')
}
body {background:#333; font-family:Arial, sans-serif}
<textarea rows="1" cols="20" id="ta1" class="textfield">напиши-ка!
</textarea>
var ta1 = document.getElementById('ta1');
ta1.addEventListener('input', function(){
var rows = Math.ceil( ta1.scrollHeight / 20 ) - 1;
ta1.style.height = 20 * rows + 'px';
});
closest: function( selectors, context ) {
var cur,
i = 0,
l = this.length,
matched = [],
targets = typeof selectors !== "string" && jQuery( selectors );
// Positional selectors never match, since there's no _selection_ context
if ( !rneedsContext.test( selectors ) ) {
for ( ; i < l; i++ ) {
for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
// Always skip document fragments
if ( cur.nodeType < 11 && ( targets ?
targets.index( cur ) > -1 :
// Don't pass non-elements to Sizzle
cur.nodeType === 1 &&
jQuery.find.matchesSelector( cur, selectors ) ) ) {
matched.push( cur );
break;
}
}
}
}
return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
},
jQuery.find.matchesSelector()
и jQuery.uniqueSort
() <li>
внутри <ul>
(по id). \(\d+\)
совпадает с открывающейся скобкой, одной или несколькими цифрами и закрывающейся скобкой. Эту регулярку заменять на совпавший фрагмент в теге <span>
:$('#catalog>li>a').each(function(){
$(this).html( function(i,t){
return t.replace(/(\(\d+\))/, '<span>$1</span>')
});
});
Fiddle