zoukankan      html  css  js  c++  java
  • ES6-ES11新语法之ES10

    对象扩展方法:

      Object.fromEntries()

      1、概念:Object.fromEntries() 是 Object.entries() 的逆操作,将二维数组(键值对数组)转为对象

        // Object.fromEntries() 是 Object.entries() 的逆操作,将二维数组(键值对数组)转为对象
        const obj = Object.fromEntries([
          ['name', '吴小明'],
          ['age', 20]
        ])
        console.log(obj) // {name: "吴小明", age: 20}
    
        // ES8中 Object.entries() 获取对象中的键值对转为二维数组
        const arr = Object.entries({ name: "吴小明", age: 20 })
        console.log(arr) // [["name", "吴小明"], ["age", 20]]
    
        // 对象到对象的转换
        const person = { name: '张三', age: 100 }
        const p = Object.fromEntries(Object.entries(person))
        console.log(p) // {name:'张三',age:100}

      2、使用场景

        // 适用于Map结构,例1:将键值对的数据结构还原为对象
        const m = new Map()
        m.set('name', '孙艺珍', 'xiaoming').set('age', 20)
        const result = Object.fromEntries(m)
        console.log(m) // {"name" => "孙艺珍", "age" => 20}
        console.log(result) // {name: "孙艺珍", age: 20}
    
        // 例2
        const map = new Map([
          ['name', '小红'],
          ['age', 18]
        ])
        const result1 = Object.fromEntries(map)
        console.log(map) // {"name" => "小红", "age" => 18}
        console.log(result1) // {name: "小红", age: 18}
        // 和 new URLSearchParams 搭配获取查询字符串
        Object.fromEntries(new URLSearchParams('foo=bar&baz=qux'))
        let queryStr = 'name=孙艺珍&age=20'
        let url = Object.fromEntries(new URLSearchParams(queryStr))
        console.log(Object.prototype.toString.call(new URLSearchParams())) // [object URLSearchParams]
        for(let item of new URLSearchParams(queryStr)){
          console.log(item) // ["name", "孙艺珍"] ["age", "20"]
        }
        console.log(url) // {name: "孙艺珍", age: "20"}
        // 定义一个函数,这个函数第一个参数为对象,另外接收其他几个参数作为需要保留的属性
        function foo(obj, ...keys) {
          return Object.fromEntries(Object.entries(obj)
            .filter(([key]) => keys.includes(key))
          )
        }
        let obj = {
          name: '小明',
          age: '12',
          sex: '男'
        }
        console.log(foo(obj, 'name', 'age')) // {name: "小明", age: "12"}
        console.table(foo(obj, 'name'))
        // 定义一个函数,传入一个参数为对象,交换其属性和值
        function fn(obj) {
          return Object.fromEntries(Object.entries(obj)
            .map(([key, value]) => [value, key])
          )
        }
        console.log({ name: '小明', age: '12' }) // {name: "小明", age: "12"}
        console.log(fn({ name: '小明', age: '12' })) // {12: "age", 小明: "name"}
        // 操作数据:将数据处理,数组对象中的值转为键值对,可以方便的粘贴到excel和数据库中
        const arr = [{
          name: '小明',
          age: 12
        }, {
          name: '小红',
          age: 14
        }]
    
        obj = Object.fromEntries(
          arr.map(({ name, age }) => [name, age])
        )
    
        console.table(obj)
        console.log(obj) // {小明: 12, 小红: 14}

      3、Object.fromEntries() 的实现

      function fromEntries(arr) {
          if (!arr) return console.error('你特么倒是传一个数组或Map进来啊!')
          return Array.from(arr).reduce(
            (acc, [key, value]) => Object.assign(acc, { [key]: value }), {}
          )
        }
        console.log(fromEntries([['name', '吴小明'], ['age', 20]])) // {name: "吴小明", age: 20}
        console.log(fromEntries(new Map([['name', '小红'], ['age', 18]]))) // {name: "小红", age: 18}
        // console.log(fromEntries()) // undefined

      4、几个注意事项

        // 1、键值对数组中如果有多余的值相当于没写
        const obj = Object.fromEntries([
          ['name', '孙艺珍'],
          ['age', '20', '21']
        ])
        console.log(obj) // {name: "孙艺珍", age: "20"}
    
        // 2、键值对中如果有重复的 key,取最后一个
        const obj1 = Object.fromEntries([
          ['name', '孙艺珍'], 
          ['name', '孙艺珍'],
          ['name', '孙艺珍']
        ])
        console.log(obj1) // {name: "孙艺珍"}

    字符串扩展方法:

      trimStart() 和 trimEnd():(trim()是ES5的方法)

        let str = '  i love you  '
        console.log(str, str.length)                         // '  i love you  ' 14
        console.log(str.trimStart(), str.trimStart().length) // 'i love you  '   12
        console.log(str.trimEnd(), str.trimEnd().length)     // '  i love you'   12
        console.log(str.trim(), str.trim().length)           // 'i love you'     10
        console.log(str.trimLeft(), str.trimLeft().length)   // 'i love you  '   12
        console.log(str.trimRight(), str.trimRight().length) // '  i love you'   12

    数组扩展方法:

      1、flat():扁平化数组,参数默认值为1,想要将 n 维数组转换为一维数组,参数值为 n-1

        // 二维数组转一维数组
        const arr = [1, 2, [3, 4], [5, 6]]
        console.log(arr.flat()) // [1, 2, 3, 4, 5, 6]
    
        // 三维数组转二维数组
        const arr1 = [1, 2, [3, 4, [5, 6]]]
        console.log(arr1.flat()) // [1, 2, 3, 4, [5, 6]]
    
        // 三维数组转一维数组
        const arr2 = [1, 2, [3, 4, [5, 6]]]
        console.log(arr2.flat(2)) // [1, 2, 3, 4, 5, 6]
        console.log(arr2.flat().flat()) // [1, 2, 3, 4, 5, 6]

      2、flatMap()

        const arr3 = [1, 2, 3, 4]
        // const result = arr3.map(item => item * 10)
        const result = arr3.flatMap(item => [item * 10]) // 同上,相当于执行完 map 方法后再执行 flat 方法将二维数组转为一维数组
        console.log(result) // [10, 20, 30, 40]

    Symbol扩展属性:

      description:获取 Symbol 属性

        let s = Symbol('你好')
    
        console.log(s.description) // 你好

    x

  • 相关阅读:
    Selenium Webdriver 自动化测试开发常见问题(C#版)VS
    HTML 和 Body 在 CSS 中的区别
    安装SDK时出现Fetching https://dl-ssl.google.com/android/repository/addons_list-1.xml
    配置好Java和SDK的环境变量后,Javac不是内部命令
    关于adb连接手机offline的问题解决
    CSDN上总结的测试工具排名
    关于性能优化
    关于WAS_1
    IIS服务器搭建
    关于WAS
  • 原文地址:https://www.cnblogs.com/wuqilang/p/14046670.html
Copyright © 2011-2022 走看看