Skip to content

Instantly share code, notes, and snippets.

View Aleksey-Danchin's full-sized avatar

Алексей Данчин Aleksey-Danchin

View GitHub Profile
@Aleksey-Danchin
Aleksey-Danchin / watch.js
Created August 20, 2016 20:07
Watch service
function Watch (obj, scheme, handler, pathOriginal = [], _obj = {}) {
scheme.forEach(fieldName => {
const path = pathOriginal.map(e => e);
if (typeof fieldName === 'string') {
path.push(fieldName);
if (['string', 'number', 'boolean'].indexOf(typeof obj[fieldName]) !== -1 || obj[fieldName] === null) {
_obj[fieldName] = obj[fieldName];
delete obj[fieldName];
Object.defineProperty(obj, fieldName, {
enumerable: true
@Aleksey-Danchin
Aleksey-Danchin / example1.js
Created October 10, 2016 08:06
Фильтрация массива на уникальные элементов
let array = [1, 'b', 3, 'f', 'f', 'd', 'a', 9, 'b', 8, 'd', 4, 9, 'a', 5, 10, 3, 'c', 8, 7, 7, 6, 1, 'g', 'a', 'g', 4, 'e', 9, 8, 6, 5, 5, 2, 'c', 'd', 'e', 1, 6, 4, 2, 'b', 3, 10, 'e', 'f', 2, 'c', 10, 'g', 7];
array = array.filter((e, i, l) => i == l.lastIndexOf(e));
console.log(array); // => [ 'a', 9, 8, 5, 'd', 1, 6, 4, 'b', 3, 'e', 'f', 2, 'c', 10, 'g', 7 ]
@Aleksey-Danchin
Aleksey-Danchin / example2.js
Last active October 11, 2016 06:02
Делаем объекты итерируемыми для for-of по [key, value]
const object = {a: 1, b: 2};
Object.defineProperty(Object.prototype, Symbol.iterator, {
enumirable: false
, configurable: true
, get: () => function * () {
for (const key of Object.keys(this))
yield [key, this[key]];
}
});
@Aleksey-Danchin
Aleksey-Danchin / example3.js
Created October 12, 2016 07:36
Доступ к первому элементу массива через .first / Доступ к последнему элементу массива через .last
Object.defineProperty(Array.prototype, 'first', {
enumerable: false
, configurable: true
, get: function () { return this[0]; }
, set: function (value) {
return this.length ? this[0] = value : this.push(value) && value;
}
});
Object.defineProperty(Array.prototype, 'last', {
@Aleksey-Danchin
Aleksey-Danchin / example4.js
Created October 13, 2016 07:22
Быстро получить все простые числа от 2 до n.
const n = 1000;
const buff = new Int16Array(n + 1);
for (let i = 3; i < buff.length; i += 2) {
buff[i - 1] = 1;
if (buff[i] == 0)
for (let j = i + i; j < buff.length; j += i)
buff[j] = 1;
}
@Aleksey-Danchin
Aleksey-Danchin / example5.js
Created October 14, 2016 19:37
Синтаксис статического геттера.
class User {
constructor (isAdmin = false) {
const user = this;
user.isAdmin = isAdmin;
User.all.push(user);
}
static get admins () {
return User.all.filter(user => user.isAdmin);
}
@Aleksey-Danchin
Aleksey-Danchin / example6.js
Last active October 17, 2016 08:56
Делаем коллекцию Map JSON-представляемой.
Object.defineProperty(Map.prototype, 'toJSON', {
enumerable: false
, configurable: true
, get: () => function () {
const obj = {};
for (const key of this.keys())
obj[key] = this.get(key);
return obj;
@Aleksey-Danchin
Aleksey-Danchin / example7.js
Created October 18, 2016 08:43
Проверка массивов на эквивалентность содержимого.
Array.isEqual = function (...arrays) {
if (arrays.length == 0) return false;
if (arrays.length == 1) return true;
const ctrl = arrays[0]
, length = ctrl.length;
for (let i = 1; i < arrays.length; i++) {
const array = arrays[i];
@Aleksey-Danchin
Aleksey-Danchin / example8.js
Last active October 21, 2016 10:36
Улучшенные свойста объектов и деструктурирующее присваивание.
function showPerson1 (name, family, age) {
console.log(name, family, age);
}
function showPerson2 ({name, family, age}) {
showPerson1(name, family, age);
}
const name = 'Aleksey', family = 'Danchin', age = 24;
@Aleksey-Danchin
Aleksey-Danchin / example9.js
Created October 21, 2016 10:34
Пример реализации цепного стиля программирования.
class Point {
constructor () {
const point = this;
point.x = 0;
point.y = 0;
point.color = 'red';
}
moveTo (x, y) {