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));
Так только по событию клика массив, наконец, отсортируют. // элементы
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();
// исходное определение:
const flip(f) => (a, b) => f(b, a);
// можно развернуть:
function flip(sourceFunction) {
return function(a, b) {
return sourceFunction(b, a);
}
}
Функция flip()
принимает аргументом функцию. И возвращает новую функцию.function flip(f) {
// ура, нам дали какую-то исходную функцию!
var sourceFunction = f; // для красоты запишем её в свою переменную
// можно и вызвать её при желании: sourceFunction(4, 5)
// но пока не будем. Рано. Ждём.
// сделаем новую, хакерскую функцию
var hackerFunc = function(a, b) {
// тут пусть всю работу делает старая функция
var result = sourceFunction(a, b);
// стоп. Не то. Надо же аргументы местами поменять
var result = sourceFunction(b, a);
// хакерский результат
return result;
} // конец определения хакер-функции
// вернём теперь хакер-функцию:
return hackerFunc;
}
Вот как flip(f) возващает новую хитрую хакерскую функцию.<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/ >
<title>Smoothed Radar Chart</title>
<!-- Google fonts -->
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,300" rel='stylesheet' type='text/css'>
<link href='https://fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'>
<!-- D3.js -->
<script src="https://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script src="https://d3js.org/d3-path.v1.min.js" charset="utf-8"></script>
<script src="radarChart.js" charset="utf-8"></script>
<style>
body {
font-family: 'Open Sans', sans-serif;
font-size: 11px;
font-weight: 300;
fill: #242424;
text-align: center;
text-shadow: 0 1px 0 #fff, 1px 0 0 #fff, -1px 0 0 #fff, 0 -1px 0 #fff;
cursor: default;
}
.legend {
font-family: 'Raleway', sans-serif;
fill: #333333;
}
</style>
</head>
<body>
<div class="radarChart" style="display: inline-flex;"></div>
<div class="radarChart2" style="display: inline-flex;"></div>
<script>
//////////////////////////////////////////////////////////////
//////////////////////// Set-Up //////////////////////////////
//////////////////////////////////////////////////////////////
var margin = { top: 50, right: 80, bottom: 50, left: 80 },
width = Math.min(700, window.innerWidth / 4) - margin.left - margin.right,
height = Math.min(width, window.innerHeight - margin.top - margin.bottom);
//////////////////////////////////////////////////////////////
////////////////////////// Data //////////////////////////////
//////////////////////////////////////////////////////////////
var data = [
{ name: 'Allocated budget',
axes: [
{axis: 'Sales', value: 42},
{axis: 'Marketing', value: 20},
{axis: 'Development', value: 60},
{axis: 'Customer Support', value: 26},
{axis: 'Information Technology', value: 35},
{axis: 'Administration', value: 20}
]
},
{ name: 'Actual Spending',
axes: [
{axis: 'Sales', value: 50},
{axis: 'Marketing', value: 45},
{axis: 'Development', value: 20},
{axis: 'Customer Support', value: 20},
{axis: 'Information Technology', value: 25},
{axis: 'Administration', value: 23}
]
}
];
//////////////////////////////////////////////////////////////
////// First example /////////////////////////////////////////
///// (not so much options) //////////////////////////////////
//////////////////////////////////////////////////////////////
var radarChartOptions = {
w: 290,
h: 350,
margin: margin,
levels: 5,
roundStrokes: true,
color: d3.scaleOrdinal().range(["#26AF32", "#762712"]),
format: '.0f'
};
// Draw the chart, get a reference the created svg element :
let svg_radar1 = RadarChart(".radarChart", data, radarChartOptions);
//////////////////////////////////////////////////////////////
///// Second example /////////////////////////////////////////
///// Chart legend, custom color, custom unit, etc. //////////
//////////////////////////////////////////////////////////////
var radarChartOptions2 = {
w: 290,
h: 350,
margin: margin,
maxValue: 60,
levels: 6,
roundStrokes: false,
color: d3.scaleOrdinal().range(["#AFC52F", "#ff6600"]),
format: '.0f',
legend: { title: 'Organization XYZ', translateX: 100, translateY: 40 },
unit: '$'
};
// Draw the chart, get a reference the created svg element :
let svg_radar2 = RadarChart(".radarChart2", data, radarChartOptions2);
</script>
</body>
</html>
const re = /jsInterface.event\("user=(\d+);level/;
let playerId;
const scripts = document.querySelectorAll('script');
for (let i = 0; i < scripts.length; i++) {
const match = scripts[i].innerText.match(re);
if (match) {
playerId = +match[1];
break;
}
}
console.log(playerId) // 4180878
как можно улучшить данный код
function anagrams(word, words) {
const sample = word.split('').sort().join('');
return words.filter(function (e) {
return e.split('').sort().join('') === sample;
})
}
function anagrams(word, words) {
const length = word.length;
const sample = word.split('').sort().join('');
return words.filter(w => w.length === length)
.filter(function (e) {
return e.split('').sort().join('') === sample;
})
}
// write the function isAnagram
var isAnagram = function(test, original) {
const length = original.length;
if (length !== test.length) return false;
const A = test.toLowerCase();
const B = original.toLowerCase();
const dict = {};
for (let i=0, char, pos; i < length; i++) {
char = A[i];
pos = B.indexOf(char, +dict[char]);
if (!~pos) return false;
dict[char] = pos + 1;
}
return true;
};
typeof
будет равен "function" и для Object, String, Date, например — что не входит в ваши планы.callback && callback();
Object.prototype.toString.call(callback) === '[object Function]'
и для вас можно так:callback && Object.prototype.toString.call(callback) === '[object Function]' && callback();
inBetween(3, 6)
возвращает не строку, не число, а функкцию. var daFunc = inBetween(3, 6); // daFunc это функция
arr.filter(daFunc);
var daFunc = function() {
console.log(arguments);
}
arr.filter(daFunc);
1«Почти» — потому, что контекст тут другой будет. Всякие a
и b
не будут определены.function daFunc() { console.log(arguments); }
arr.filter(daFunc);
arr.filter( function() { console.log(arguments); });
arguments
там никакой не внешний / родительский / фильтрованный, а свой собственный.ipinfo.io
предоставляет API, есть бесплатный план (до 50 тыс. запросов в месяц)$.get("https://ipinfo.io", function(response) {
console.log(response.ip, response.country);
}, "jsonp")
{
"ip": "134.209.xxx.xxx",
"city": "Clifton",
"region": "New Jersey",
"country": "US",
"loc": "40.8344,-74.1377",
"org": "AS14061 DigitalOcean, LLC",
"postal": "07014",
"timezone": "America/New_York",
"readme": "https://ipinfo.io/missingauth"
}
var
переменная i
в любых вызовах навешанных функций имеет последнее своё значение из цикла, равное длине experimentElem
.var
на let
:for (let i = 0; i < experimentElem.length; i++) {
[...experimentElem].forEach((el, i) => {
el.addEventListener('mouseenter', event => gifElem[i].play());
el.addEventListener('mouseleave', event => gifElem[i].pause());
})