# JS方法小记

5 min read
Table of Contents

关于 JS 的一些方法

自定义排序

function customSort<T>(
group: { [key: string]: T }[],
arr: T[],
key: string,
): { [key: string]: T }[] {
return group.sort((a, b) => {
return arr.indexOf(a[key]) - arr.indexOf(b[key])
})
}

示例如下:

const arr = ['foo', 'bar', 'baz']
const group = [
{
key: 'bar',
value: 1,
},
{
key: 'foo',
value: 2,
},
{
key: 'baz',
value: 3,
},
{
key: 'foo',
vlaue: 4,
},
]
const sortGroup = customSort(group, arr, 'key')
// [{value: 2, key: 'foo'}, {value: 4, key: 'foo'},
// {value: 1, key: 'bar'}, {value: 3, key: 'baz'}]

Array.includes 处理多重条件

function func(arg) {
if (arg === 'A' || arg === 'B' || arg === 'C') {
/* do something */
}
}
function func(arg) {
const arr = ['A', 'B', 'C']
if (arr.includes(arg)) {
/* do something */
}
}

Array.every 和 Array.some 处理条件

const arr = [
{ name: 'AA', age: 10 },
{ name: 'BB', age: 20 },
{ name: 'CC', age: 30 },
]
// 满足全部条件
const bool = arr.every((item) => item.name === 'AA')
// 满足部分条件
const bool = arr.some((item) => item.age < 35)

接收参数的方式

function func(url, res, search, page, limit) {} // 需要记住参数顺序
function func({ url, res, search, page, limit }) {} // 不需要记住参数顺序,记参数名称

对象转数组

const nubmers = {
one: 1,
two: 2,
}
const key = Object.keys(numbers) // ['one', 'two']
const value = Object.values(numbers) // [1, 2]
const entry = Object.entries(numbers) // [['one': 1], ['two', 2]]

数组的判断

  • 判断是否为数组:Array.isArray()
  • 类数组转化数组:Array.from()

检查是否为工作日

const isWeekday = (date) => date.getDay() % 6 !== 0

concat 和 push

push 修改源数组,concat 返回新数组,concat 可以连接数组。

var arr = [1, 2]
arr.push(3) // arr: [1, 2, 3]
arr.push([4, 5]) // arr: [1, 2, 3, [4, 5]]
var arr = [1, 2]
var arrA = arr.concat(3) // arr: [1, 2]; arrA: [1, 2, 3];
var arrB = arr.concat([4, 5]) // arr: [1, 2]; arrB: [1, 2, 4, 5];

返回从 0 开始的数组

Array.from(Array(5).keys()) //[0, 1, 2, 3, 4]

中断 forEach

使用 splice 删除剩余项,中断 forEach 的循环。⛔该方法会改变原数组,请慎用

const arr = [1, 2, 3, 4, 5]
arr.forEach((item, idx) => {
if (item === 3) {
arr.splice(idx + 1, arr.length - idx)
// arr.length = 0; // 甚至可以直接清空数组
}
console.log(item)
})
// 1, 2, 3
console.log(arr) // [1, 2, 3]

中断 for 循环

使用 break 打断 for 循环

const arr = [1, 2, 3, 4, 5]
for (k in arr) {
console.log(arr[k])
if (arr[k] === 3) {
break
}
}
// 1, 2, 3

千分位分隔符

function _comma(number) {
return number.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,')
}

题解 | 实现数字按每隔 3 位用,区隔开

for…in 与 for…of

for…in 迭代对象的可枚举字符串属性,包括原型链上可枚举的属性。

for (variable in object) statement

for…of 语句是为了方便迭代迭代器。对象 object 是不可迭代的,迭代 object 会报错 Error: object is no iterable

for (variable of iterable) statement

JS 中常用的按位运算应用

JS 中常用的按位运算应用

在 Array.map 使用 async/await

在使用 forEach 或者 map 等数组遍历的方式,遇到异步调用的函数,直接使用 async/await 的话,会得到一个 Promise<T>[] 的结果。

通过使用 Promise.all 可以得到异步返回的结果

var arr = [1, 2, 3, 4, 5]
var results: number[] = await Promise.all(
arr.map(async (item): Promise<number> => {
await callAsynchronousOperation(item)
return item + 1
}),
)

More Posts

# ES6 Features

17 min read

ECMAScript 6,也称为 ECMAScript 2015,是 ECMAScript 最新版本(注: 已经不是最新版本)。ES6 对于这门语言来说是一个很重要的更新,而且这是 2009 年后的 ES5 标准之后的第一次更新。现在主流的 JavaScript 引擎都已经实现这些功能——查看详情。