数组增加一批新原型方法

master
yutent 2023-06-20 18:44:43 +08:00
parent 0ebe311615
commit 9fe20a39e2
2 changed files with 93 additions and 7 deletions

View File

@ -15,7 +15,13 @@
│ ├── .flatMap(fn) // 等价于 map(fn) -> flat(1)
│ ├── .at(index) // 读取指定位置的元素, 负值则从后往前读
│ ├── .findLast(fn) // 查找匹配的最后一项
│ └── .findLastIndex(fn) // 查找匹配的最后一项的索引值
│ ├── .findLastIndex(fn) // 查找匹配的最后一项的索引值
│ ├── .toSorted(fn) // 数组排序, 返回一个副本(不改变原数组)
│ ├── .toReversed(fn) // 反转数组, 同样返回一个副本
│ ├── .toSpliced(fn) // 数组截取, 同样返回副本
│ ├── .with(index, newValue) // 创建一个副本,再修改副本中的元素, 返回副本
│ ├── .group(fn) // 数组分组
│ └── .groupToMap(fn) // 数组分组, 返回Map对象
├── Date
│ └── .isDate(any) // 判断对象是否为 日期对象

View File

@ -7,7 +7,7 @@
* 重写原生的flat方法, 性能提升5~10(看数组的结构)
*/
Object.defineProperty(Array.prototype, 'flat', {
value: function(deep = 1, arr = []) {
value: function (deep = 1, arr = []) {
for (let it of this) {
if (Array.isArray(it) && deep > 0) {
it.flat(deep - 1, arr)
@ -22,7 +22,7 @@ Object.defineProperty(Array.prototype, 'flat', {
})
Object.defineProperty(Array.prototype, 'flatMap', {
value: function(fn) {
value: function (fn) {
return this.map(fn).flat()
},
writable: true
@ -30,8 +30,8 @@ Object.defineProperty(Array.prototype, 'flatMap', {
if (!Array.prototype.at) {
Object.defineProperty(Array.prototype, 'at', {
value: function(num) {
var n = +num
value: function (num) {
let n = +num
if (n < 0) {
n += this.length
}
@ -43,7 +43,7 @@ if (!Array.prototype.at) {
if (!Array.prototype.findLast) {
Object.defineProperty(Array.prototype, 'findLast', {
value: function(fn) {
value: function (fn) {
let num = this.length
while (num > 0) {
let item = this[--num]
@ -57,7 +57,7 @@ if (!Array.prototype.findLast) {
// 没有findLast也不会有findLastIndex
Object.defineProperty(Array.prototype, 'findLastIndex', {
value: function(fn) {
value: function (fn) {
let num = this.length
while (num > 0) {
let item = this[--num]
@ -70,3 +70,83 @@ if (!Array.prototype.findLast) {
writable: true
})
}
// 最新增加的几种方法
if (!Array.prototype.toSorted) {
Object.defineProperty(Array.prototype, 'toSorted', {
value: function (fn) {
return [...this].sort(fn)
},
writable: true
})
Object.defineProperty(Array.prototype, 'toReversed', {
value: function () {
return [...this].reverse()
},
writable: true
})
Object.defineProperty(Array.prototype, 'toSpliced', {
value: function (...args) {
return [...this].splice(...args)
},
writable: true
})
Object.defineProperty(Array.prototype, 'with', {
value: function (num, val) {
let n = +num
let arr = [...this]
if (n < 0) {
n += arr.length
}
arr[n] = val
return arr
},
writable: true
})
}
// 数组分组
if (!Array.prototype.group) {
Object.defineProperty(Array.prototype, 'group', {
value: function (fn) {
let output = {}
if (typeof fn === 'function') {
for (let it of this) {
let key = fn(it)
if (output[key]) {
output[key].push(it)
} else {
output[key] = [it]
}
}
return output
} else {
throw Error('argument callback must be a function.')
}
},
writable: true
})
Object.defineProperty(Array.prototype, 'groupToMap', {
value: function (fn) {
let output = new Map()
if (typeof fn === 'function') {
for (let it of this) {
let key = fn(it)
if (output.has(key)) {
output.get(key).push(it)
} else {
output.set(key, [it])
}
}
return output
} else {
throw Error('argument callback must be a function.')
}
},
writable: true
})
}