-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDemo15_advance_01.js
152 lines (110 loc) · 5.7 KB
/
Demo15_advance_01.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
* * JavaScript Snippet - Useful - Part 01
*/
//! all
//? Kiểm tra các phần tử trong mảng có thỏa mãn điểu kiện đã cho không (fn).
//? Khi không truyền tham số thứ 2, mặc định fn = true
const all = (arr, fn = Boolean) => arr.every(fn);
all([4, 2, 3], x => x > 1); // true
all([1, 2, 3], x => x > 1); // false
all([1, 2, 3]); // true
//! allEqual
//? Kiểm tra các phần tử trong mảng có bằng nhau không
const allEqual = arr => arr.every(val => val === arr[0]);
allEqual([1, 2, 3, 4, 5, 6]); // false
allEqual([1, 1, 1, 1]); // true
//! approximatelyEqual
//? Kiểm tra hai số đã cho có xấp xỉ bằng nhau không với 1 sai số nhất định
const approximatelyEqual = (n1, n2, epsilon = 0.001) => Math.abs(n1 - n2) < epsilon;
approximatelyEqual(Math.PI / 2.0, 1.5708); // true
approximatelyEqual(2, 1.5708); // false
approximatelyEqual(2, 1.5708, 1); // true
//! arrayToCSV
//? Convert các phần tử thành chuỗi với các giá trị được phân tách bằng dấu phẩy.
//? Có thể lưu thành file CSV
const arrayToCSV = (arr, delimiter = ',') =>
arr.map(val => val.map(item => `"${item}"`).join(delimiter)).join('\n');
arrayToCSV([['a', 'b'], ['c', 'd']]); // '"a","b"\n"c","d"'
arrayToCSV([['a', 'b'], ['c', 'd']], ':'); // '"a":"b"\n"c":"d"'
//! attempt
//? Thực thi một hàm, trả về kết quả hoặc error object đã bắt được.
const attempt = (fn, ...args) => {
try {
return fn(...args);
} catch (e) {
return e instanceof Error ? e : new Error(e);
}
};
const elements = attempt(function(selector) {
return document.querySelectorAll(selector);
}, '>_>');
if (elements instanceof Error) elements = []; // elements = []
//! average
//? Trả về giá trị trung bình của hai hay nhiều phân tử
const average = (...nums) => nums.reduce((acc, val) => acc + val, 0) / nums.length;
average(...[1, 2, 3]); // 2
average(1, 2, 3); // 2
//! averageBy
//? Trả về giá trị trung bình của một mảng.
const averageBy = (arr, fn) =>
arr.map(typeof fn === 'function' ? fn : val => val[fn]).reduce((acc, val) => acc + val, 0) /
arr.length;
averageBy([{ x: 1 }, { x: 2 }, { n: 3 }, { n: 4 }], item => item.x); // 2.5
averageBy([{ x: 1 }, { x: 2 }, { n: 3 }, { n: 4 }], 'x'); // 2.5
//! bottomVisible
//? Kiểm tra xem cuối trang có hiển thị hay không.
const bottomVisible = () => document.documentElement.clientHeight + window.scrollY >=
(document.documentElement.scrollHeight || document.documentElement.clientHeight);
bottomVisible(); // true
//! byteSize
//? Trả về độ dài của một chuỗi được tính bằng byte.
const byteSize = str => new Blob([str]).size;
byteSize('😍'); // 4
byteSize('Viblo May fest'); // 14
//! capitalize
//? Viết hoa chữ cái đầu tiên của một chuỗi.
const capitalize = ([first, ...rest]) => first.toUpperCase() + rest.join('');
capitalize('vibloMayFest'); // 'VibloMayFest'
//! capitalizeEveryWord
//? Viết hoa chữ cái đầu tiên của mỗi từ trong một chuỗi.
const capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase());
capitalizeEveryWord('viblo may Fest'); // 'Viblo May Fest'
//! castArray
//? Convert một giá trị không phải mảng thành mảng.
const castArray = val => (Array.isArray(val) ? val : [val]);
castArray('viblo'); // ['viblo']
castArray([1]); // [1]
//! compact
//? remove những giá trị false ra khỏi một mảng.
const compact = arr => arr.filter(Boolean);
compact([0, 1, false, 2, '', 'a', 'e' * 23, NaN, 100]); // [1, 2, "a", 100]
//! countOccurrences
//? Đếm số lần xuất hiện của một giá trị trong một mảng.
const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0);
countOccurrences([1, 2, 2, 1, 3, 3, 2, 4], 1); // 2
//! Create Directory
//? Kiểm tra thư mục đã tồn tại hay chưa. Nếu chưa sẽ tạo thư mục
const fs = require('fs');
const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined);
createDirIfNotExists('test'); // tạo thư mục 'test' nếu nó chưa tồn tại
//! currentURL
//? Trả về đường dẫn hiện tại - cái này chỉ chạy trên Web-Browser
const currentURL = () => window.location.href;
currentURL();
//! decapitalize
//? Covert chữ cái đầu tiên thành chữ thường trong 1 chuỗi
const decapitalize = ([first, ...rest]) => first.toLowerCase() + rest.join('')
decapitalize('Viblo May Fest'); // 'viblo May Fest'
//! deepFlatten
//? Làm phẳng một mảng bằng cách sử dụng đệ quy.
const deepFlatten = arr => [].concat(...arr.map(val => (Array.isArray(val) ? deepFlatten(val) : val)));
deepFlatten([1, [2], [[3], 4], 5]); // [1,2,3,4,5]
//! defer
//? Thực thi sau cùng, các fuction khác sẽ được gọi trước hàm này.
const defer = (fn, ...args) => setTimeout(fn, 1, ...args);
defer(console.log, 'a'), console.log('b'), console.log('c');
// log của 'b', 'c' thực thi trước sau đó mới đến 'a'
//! degreesToRads
//? Chuyển đổi từ độ sang radian (được sử dụng trong tính toán hình học)
const degreesToRads = deg => (deg * Math.PI) / 180.0;
degreesToRads(45); // ~0.7854