diff --git a/Readme.md b/Readme.md index d660207..85ddc5b 100644 --- a/Readme.md +++ b/Readme.md @@ -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) // 判断对象是否为 日期对象 diff --git a/src/lib/array.js b/src/lib/array.js index 6304c20..69094d4 100644 --- a/src/lib/array.js +++ b/src/lib/array.js @@ -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 + }) +}