# 常用筆記
### 小數點去除補 0, 防止浮點異位
``` js=
const formatter = new Intl.NumberFormat('en-US', {
style: 'decimal',
minimumFractionDigits: 2,
maximumFractionDigits: 2,
});
console.log(formatter.format(372.24-116.85));
```
### 一行程式new出二維陣列
```javascript=
apple = new Array(10).fill(null).map(()=>new Array(10).fill(null));
```
### 一行程式new 一維陣列 並且產生隨機數
```javascript=
Array(3).fill().map(() => Math.round(Math.random() * 10))
```
### 根據數量產生陣列預設值
```javascript=
[...Array(10)].map((it,index)=>index)
```
### 比較版本號
``` ts=
export const compareVersion = (currentVersion: string, newVersion: string) => {
const v1 = currentVersion.split('.').map(Number);
const v2 = newVersion.split('.').map(Number);
for (let i = 0; i < Math.max(v1.length, v2.length); i++) {
const num1 = v1[i] || 0;
const num2 = v2[i] || 0;
if (num1 < num2) return true; // version2 is greater if any corresponding part is greater
if (num1 > num2) return false; // version1 is greater if any corresponding part is greater
}
return false; // versions are equal
};
// Example usage:
const oldVersion = '1.0.1';
const newVersion = '1.2.3';
if (compareVersions(oldVersion, newVersion)) {
console.log(newVersion + ' is an update over ' + oldVersion);
} else {
console.log(newVersion + ' is not an update over ' + oldVersion);
}
```
### Array 轉 Object

Object.fromEntries 能把元素[key,value]
轉成對應的 object
### Object 轉 Array

### 正則過濾 只留下數字
``` JS=
let str = '001a0123vbas2!35#%';
str.replace(/[^\d]/g, "")
```
### JS引用檔案方式對比
#### module exports (CommonJS)
* require
Node.js 和 ES6 都支援的引入
* export / import
只有ES6 支援的導出引入
* module.exports / exports
CommonJS
### 去除浮點數 || 字串轉數字
``` javascript=
let test = "123"
let numberTest = test >> 0
```
### Date.now 轉成 yyyy-mm-dd
``` js=
new Date().toISOString().slice(0, 10)
```
### 檢查陣列元素是否有empty元素
``` js=
array.includes(undefined);
```
### 檢查陣列內元素是否重複
``` js=
function checkIfDuplicateExists(arr) {
return new Set(arr).size !== arr.length
}
var arr = ["a", "a", "b", "c"];
var arr1 = ["a", "b", "c"];
console.log(checkIfDuplicateExists(arr)); // true
console.log(checkIfDuplicateExists(arr1)); // false
```
### object轉base64 base64轉object(能傳到網址query)
Base64 編碼後的字串可能包含一些字元,
在網址中使用時可能會產生問題。
例如在網址中使用 + 字元時,
會被解讀為空格。為了避免這個問題,
可以使用 URL-safe Base64 編碼,
即將 + 和 / 字元替換為 - 和 _ 字元。
這樣在網址中使用時就不會產生問題了。
>加密
``` js=
const obj = {
name: '小明',
age: 18,
hobbies: ['reading', 'swimming', 'traveling']
};
const arr = Object.values(obj);
const jsonStr = JSON.stringify(arr);
const encoder = new TextEncoder();
const uint8Array = encoder.encode(jsonStr);
const base64Str = btoa(String.fromCharCode(...uint8Array)).replace(/\+/g, '-').replace(/\//g, '_');
console.log(base64Str); // "W3sibmFtZSI6IuW8oOWtlSIsImFnZSI6MTgsImhvYmJpZXMiOlsicmVhZGluZyIsInN3aW1tc2luZyIsInRyYXZlbGluZyJdfQ=="
```
>解密
``` js=
const base64Str = "W3sibmFtZSI6IuW8oOWtlSIsImFnZSI6MTgsImhvYmJpZXMiOlsicmVhZGluZyIsInN3aW1tc2luZyIsInRyYXZlbGluZyJdfQ==";
const base64Url = base64Str.replace(/-/g, '+').replace(/_/g, '/');
const uint8Array = Uint8Array.from(atob(base64Url), c => c.charCodeAt(0));
const decoder = new TextDecoder();
const jsonStr = decoder.decode(uint8Array);
const arr = JSON.parse(jsonStr);
const obj = Object.fromEntries(Object.keys(obj).map((key, index) => [key, arr[index]]));
console.log(obj); // {name: "小明", age: 18, hobbies: ["reading", "swimming", "traveling"]}
```
### object轉base64 base64轉object
``` js=
function utf8_to_base64(str) {
return window.btoa(unescape(encodeURIComponent(str)));
}
function base64_to_utf8(str) {
return decodeURIComponent(escape(window.atob(str)));
}
utf8_to_base64(JSON.stringify(row)
JSON.parse(base64_to_utf8(getUrlParameter("rowData"))
```
### js將一位數組分割成每n個一組
``` js=
function spArr(arr, num) {
let newArr = []
for (let i = 0; i < arr.length;) { 沒有i++
newArr.push(arr.slice(i, i += num));
}
return newArr
}
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
console.log(spArr(arr, 4))
```
### 每三位數字加逗號
``` js=
export function thousandSpr(x) {
if (x === null || x === undefined) {
return '';
}
const parts = x.toString().split('.');
const replacement = ',';
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, replacement);
return parts.join('.');
}
```
### 多層級物件展開一維陣列,並且也能轉回去
``` js=
// 函數將多層級物件轉換為一維數組
function flattenObject(obj, prefix = '') {
const flatObject = {};
for (const key in obj) {
if (typeof obj[key] === 'object' && !Array.isArray(obj[key])) {
// 遞迴處理內部物件
const nestedObject = flattenObject(obj[key], `${prefix}${key}.`);
Object.assign(flatObject, nestedObject);
} else {
flatObject[`${prefix}${key}`] = obj[key];
}
}
return flatObject;
}
// 函數將一維數組轉換回多層級物件結構
function unflattenObject(flatObject) {
const nestedObject = {};
for (const key in flatObject) {
const keys = key.split('.');
let currentObject = nestedObject;
for (let i = 0; i < keys.length - 1; i++) {
const nestedKey = keys[i];
currentObject[nestedKey] = currentObject[nestedKey] || {};
currentObject = currentObject[nestedKey];
}
currentObject[keys[keys.length - 1]] = flatObject[key];
}
return nestedObject;
}
// 原始多層級物件
const originalObject = {
person: {
name: 'Alice',
address: {
street: '123 Main St',
city: 'Anytown',
},
},
age: 30,
};
// 將多層級物件轉換為一維數組
const flatData = flattenObject(originalObject);
// 假設在一維數組上執行一些運算
for (const key in flatData) {
if (typeof flatData[key] === 'number') {
flatData[key] *= 2; // 假設將數字倍增
}
}
// 將一維數組還原回多層級物件
const restoredObject = unflattenObject(flatData);
console.log('原始物件:');
console.log(originalObject);
console.log('\n一維數組:');
console.log(flatData);
console.log('\n還原後的物件:');
console.log(restoredObject);
```
### Date時間相關
#### date 轉成星期幾
```js=
new Date('2022-03-06').toLocaleString("cn", { weekday: "long" })
```
#### date to yyyy/mm/dd
處理時區
```js=
Date.prototype.toISOString = function () {
let pad =(n)=>(n < 10)?'0' + n:n;
let hours_offset = this.getTimezoneOffset() / 60;
let offset_date = this.setHours(this.getHours() - hours_offset);
let symbol = (hours_offset >= 0) ? "-" : "+";
let time_zone = symbol+pad(Math.abs(hours_offset))+ ":00";
return this.getUTCFullYear() +
'-' + pad(this.getUTCMonth() + 1) +
'-' + pad(this.getUTCDate()) +
'T' + pad(this.getUTCHours()) +
':' + pad(this.getUTCMinutes()) +
':' + pad(this.getUTCSeconds()) +
'.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice(2, 5) +
time_zone;
};
```
```js=
new Date().toISOString().slice(0, 10).replace(/-/g,'/')
```
``` js=
join("\\n\n")
```