【study】reduce应用

144 阅读2分钟

一. reduce

  1. 定义和用法:

image.png 2. 举例:

// 求和
        const list = [1, 2, 3, 4, 5]
        const total = list.reduce((prev, next) => {
                  return prev + next;
        })

// 求和

        const list = [
            { subject: '语文', marks: 1 },
            { subject: '美术', marks: 2 },
            { subject: '设计', marks: 3 }
        ]
        const total = list.reduce((prev, next) => {
            return prev + next.marks;
        },0)
        
// 数组flat处理
        const list = [ [1,2], [3,4], [5,6], [7,8] , [9,10] ];
        const res = list.reduce((prev, next) => {
            return prev.concat(next);
        })

// 去重
        const list = [1,2,3,4,5,1,1,1,1,33,3,3]
        const res = list.reduce((prev, next) => {
            if (!prev.includes(next)){
                prev.push(next)
            }
            return prev
        },[])
 
 // 最大值
        const list = [1,2,3,4,5]
        const res = list.reduce((prev, next) => {
            return prev > prev ? prev : next;
        })
 
 // 字符出现的次数
     // reduce
        const str = 'sfhjasfjgfasjuwqrqadqeiqsajsdaiwqdaklldflas-cmxzmnha';
        const res = str.split('').reduce((prev,next)=> {
            prev[next]? prev[next]++ : prev[next] = 1;
            return prev
        },{})
     
    // 非reduce
    function findMax (str) {
        if (str.length === 1) {
            return str
        }
        let charObj = {}
        for (let i = 0 ; i < str.length; i++) {
            !charObj[str.charAt(i)] ? charObj[str.charAt(i)]= 1 : charObj[str.charAt(i)]++
        }
        let maxChar = '',
            maxValue = 1;

        console.log(charObj)
        for(let  k in charObj) {
            if (charObj[k] >= maxValue) {
                maxChar = k;
                maxValue = charObj[k]
            }
        }
        return maxChar;
    }

    console.log(findMax(str))
  
 // 取出数组的name值作为对象的key值
        const list = [{ name: '技术', id: 1 }, { name: '设计', id: 2 }];
        const res = list.reduce((prev,next)=> {
            prev[next.name] = next
            return prev;
        }, {});
 
 // 按照比例求和
        const result = [
            { subject: 'a', score: 100 },
            { subject: 'b', score: 100 },
        ];
        const dis = {
            a: 0.5,
            b: 0.3,
        };
        const res = result.reduce((prev,next)=> {
            return dis[next.subject] * next.score + prev
        },0);

// 取值 [a: 10, b: 20, c: 30]
 const data = [
      {
        a: 10,
      },
      {
        b: 20
      },
      {
        c: 30
      }
    ]
 const res = data.reduce((prev, next) => {
      prev[Object.keys(next)[0]] = Object.values(next)[0]
      return prev
    }, [])

    console.log(res);

// 取值  [a: 10,ff: 50,fff: 60,b: 20,c: 30]
 const data = [
      {
        a: 10,
        ff: 50,
        fff:60,
      },
      {
        b: 20
      },
      {
        c: 30
      }
    ]
 
  const result = data.reduce((arr, obj) => {
        for (let key in obj) {
            arr.push(`${key}: ${obj[key]}`);
        }
        return arr;
    }, []);

    console.log(result)

    const output = `[${result.join(',')}]`;
    console.log(output); // 输出 arr[a: 10,ff: 50,b: 20,c: 30]

例子:  
  let url = 'https://ali.com?a=1&b=2&c=3'
  // 输出 {a:1, b: 2, c:3}

  function test(url) {
    const str = url.split('?')[1].split('&')
    console.log(str)

    const result = str.reduce((prev,next)=> {
      const res = next.split('=')
      console.log(res, 'res')
      // prev[res][0] = [res][1]
      prev[res[0]] = res[1]
      return prev
    }, {})
    return result
  }

  console.log(test(url))

二. filter

  1. 定义和用法: filter()方法会创建一个新数组,原数组的每个元素传入回调函数中,回调函数中有return返回值,若返回值为true,这个元素保存到新数组中;若返回值为false,则该元素不保存到新数组中;原数组不发生改变。
// 重点:新数组
       const list = [1,2,3,4]
       const res = list.filter((i)=> {
           if (i> 2) {
               return true
           }
           return false
       })

三. 比大小

// 比较大小
   const a = '10.8.66.1'
   const b = '10.8.66'
   
 
        function handle(a, b) {
            a = a.split('.')
            b = b.split('.')

            const len = Math.max(a.length, b.length)

            while (a.length < len) {
                a.push('0')
            }

            console.log(a,'a')

            while (b.length < len) {
                b.push('0')
            }
            console.log(b,'b')

            for (let i = 0 ; i < len; i++) {
                const num1 = parseInt(a[i])
                const num2 = parseInt(b[i])

                if (num1 > num2) {
                    return 1
                } else if (num1 < num2) {
                    return -1
                }
            }
            return 0
        }
        
        
        
        // function handle(a,b) {
        //    const a1 = a.split('.')
        //    const b1 = b.split('.')

        //    if (a1.length > b1.length) {
        //        return 'a大'
        //    } else if (a1.length < b1.length) {
        //        return 'b大'
        //    } else {
        //         for(let i = 0 ; i < a1.length ; i++) {
        //             console.log(+a1[i], 'i')
        //             console.log(+b1[i], 'b')
        //             if (+a1[i] > +b1[i]) {
        //                 return 'a大'
        //             } else if (+a1[i] < +b1[i]) {
        //                 return 'b大'
        //             } 
        //     }
        //     return '一样大'
        //    }
        // }

四. 一些方法

// 去前后空格
function deleteSpace(str) {
    if (str) {
        str = str.toString();
        return str.replace(/(^\s*)|(\s*$)/g, '');
    }
    return null;
}

// 数组去重,去空格,转成number
function arrayNumberUnique(arr) {
    const json = {};
    const arrResult = [];
    for (let i = 0; i < arr.length; i++) {
        arr[i] = deleteSpace(arr[i]);
        if (arr[i] !== '' && arr[i] !== null) {
            if (!json[arr[i]]) {
                const reg = /^\d*$/g;
                if (reg.test(arr[i])) {
                    arrResult.push(+arr[i]);
                    json[arr[i]] = 1;
                } else {
                    return {
                        data: [],
                        code: -1,
                    };
                }
            }
        }
    }
    return {
        data: arrResult,
        code: 0,
    };
}

// 判断是否为数字
function number(num) {
    const reg = /^\d*$/g;
    if (reg.test(num)) {
        return true;
    }
    return false;
}

// string转成number
function strToNumber(arr) {
    const result = [];
    arr.forEach(item => {
        if (item !== '' && item !== null) {
            result.push(+item);
        }
    });
    return result;
}

// 找出数组重复元素
function duplicates(arr) {
    const result = [];
    arr.forEach(item => {
        if (arr.indexOf(item) !== arr.lastIndexOf(item) && result.indexOf(item) === -1) {
            result.push(item);
        }
    });
    return result;
}

// 数组去空格,判断是否重复,转成number  code:-1 格式有误  code:-2 重复数值  isCheckDuplicate:是否检查重复
function arrayNumber(arr, isCheckDuplicate = true) {
    let result = [];
    for (let i = 0; i < arr.length; i++) {
        arr[i] = deleteSpace(arr[i]);
        if (arr[i] !== '' && arr[i] !== null) {
            if (!number(arr[i])) {
                return {
                    data: result,
                    code: -1,
                };
            }
        }
    }
    arr = strToNumber(arr);
    result = duplicates(arr);
    if (result.length && isCheckDuplicate) {
        return {
            data: result,
            code: -2,
        };
    }
    return {
        data: arr,
        code: 0,
    };
}