js---数组方法的扩展

111 阅读1分钟
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    /**
     * 数组方法的扩展
     */
    class MyArray extends Array {
        constructor() {
            super();
        }

        /**
         * 求和
         * @returns 
         */
        sum() {
            return this.reduce(((previousValue, currentValue) => previousValue + 1 * currentValue), 0)
        }

        /**
         * 根据提供的 keyName 求和
         * @returns
         */
        sumByKeyName(keyName) {
            return this.reduce(((previousValue, currentValue) => previousValue + 1 * currentValue[keyName]), 0)
        }

        /**
         * 求平均值
         * @returns
         */
        avg() {
            return this.sum() / this.length
        }

        /**
         * 根据提供的 keyName 求平均值
         * @returns
         */
        avgByKeyName(keyName) {
            return this.sumByKeyName(keyName) / this.length
        }

        /**
         * 根据提供的 keyName 转成map
         * @param keyName
         * @returns {Map<any, any>}
         */
        toMap(keyName) {
            let map = new Map();
            for (const item of this) {
                map.set(item[keyName], item)
            }
            return map
        }

        /**
         * 根据提供的 keyName 分组
         * @param keyName
         * @returns {Map<any, any>}
         */
        groupByKeyName(keyName) {
            let map = new Map();
            for (const item of this) {
                if (map.has(item[keyName])) {
                    map.get(item[keyName]).push(item)
                } else {
                    map.set(item[keyName], MyArray.of(item))
                }
            }
            return map;
        }

        /**
         * 根据提供的 keyName 分组并统计每组个数
         * @param keyName
         * @returns {Map<any, any>}
         */
        groupByKeyNameAndCounting(keyName) {
            let map = new Map();
            for (const item of this) {
                if (map.has(item[keyName])) {
                    let value = map.get(item[keyName]);
                    map.set(item[keyName], ++value)
                } else {
                    map.set(item[keyName], 1)
                }
            }
            return map;
        }

        /**
         * 根据提供的 keyName 升序
         * @param keyName
         */
        sortAscByKeyName(keyName) {
            this.sort((a, b) => a[keyName] - b[keyName])
        }

        /**
         * 根据提供的 keyName 降序
         * @param keyName
         */
        sortDescByKeyName(keyName) {
            this.sort((a, b) => b[keyName] - a[keyName])
        }

        /**
         * 根据提供的 keyName 去最小值
         * @param keyName
         */
        minByKeyName(keyName) {
            this.sortAscByKeyName(keyName);
            return this[0][keyName];
        }

        /**
         * 根据提供的 keyName 去最大值
         * @param keyName
         */
        maxByKeyName(keyName) {
            this.sortDescByKeyName(keyName);
            return this[0][keyName];
        }

    }

    let arr = MyArray.of(...[
        {id: 1, age: 12, name: "zs"},
        {id: 2, age: 22, name: "ls"},
        {id: 3, age: 12, name: "wmy"},
        {id: 4, age: 6, name: "bwf"},
    ])
    arr.push({id: 5, age: 30, name: "haha"})
    console.log('groupByKeyName', arr.groupByKeyName("age"))
    console.log('groupByKeyNameAndCounting', arr.groupByKeyNameAndCounting("age"))
    console.log('minItemByKeyName', arr.minByKeyName("age"))

</script>
</html>