美文网首页
ES6+ 数组字符串操作

ES6+ 数组字符串操作

作者: 贺大大i | 来源:发表于2021-12-18 21:14 被阅读0次

    concat 连接两个或多个数组,并返回结果

    concat()可以连接两个或多个数组,并将新的数组返回

    不会改变原数组

        var arr1 = [1, 2, 3]
        var arr2 = [4, 5, 6]
        var arr3 = arr1.concat(arr2)
        console.log(arr3);//[1, 2, 3, 4, 5, 6]
    

    join 数组转字符串

    数组转字符串,不会改变原数组 将字符串返回

    在join()中指定一个字符串作为参数,这个字符串会成为连接符

    不指定连接符,默认使用 逗号作为连接符

    var arr1 = [1, 2, 3]
    var arr2 = arr1.join()
    console.log(arr2);//1,2,3

    reverse 反转数组

    会修改原数组

    var arr1 = [1, 2, 3]
        arr1.reverse()
        console.log(arr1);// [3, 2, 1]
    

    sort 排序

    会改变原数组

    a - b 升序

    b - a 降序

    var arr1 = [1, 2, 3]
    arr1.sort((a, b) => b - a)
    console.log(arr1);//[3, 2, 1]

    Array.of 默认值

    var arr = Array.of(100)
    console.log(arr)//100
    console.log(arr.length)// 1

    Array.fill填充默认值

    var arr = Array(100) //此时是100个空 length是100
    var arr = Array(10).fill(0) // 此时是10个0

    字符串转数组的几种方法

    方法一
    var str = "hello,word"
    var arr = str.split(",")//['hello', 'word']

    方法二 具有length属性才可以转化
    from可以将伪数组转化为真实数组
    var obj = {
    0:"张三",
    1:18,
    length:2
    }
    console.log(Array.from(obj)) // ['张三', 18]

    indexOf()查找元素

    var arr = [1,2,3,4]
    arr.indexOf(3) // 返回索引2

    var arr = [1,2,3,4,"5"]
    arr.indexOf(5) // 返回-1 查找不到返回-1 严格类型查找

    var arr = [5,1,2,3,4,5]
    arr.indexOf(5,1) //5 arr.indexOf(要查找的元素,查找的起始位置(索引))

    find 查找元素,把元素返回,适合引用 数据类型

    let lessons = [{ name: "js" }, { name: "css" }, { name: "java" }]
    let status = lessons.find(item => item.name === "js")
    console.log(status);//{name: 'js'}

    findIndex查找元素,把元素索引位置返回

    let lessons = [{ name: "js" }, { name: "css" }, { name: "java" }]
    let status = lessons.findIndex(item => item.name === "js")
    console.log(status);//0

    every 监测数组所有元素是否符合条件

    ● 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。
    ● 如果所有元素都满足条件,则返回 true。
    ● 注意: every() 不会对空数组进行检测。
    注意: every() 不会改变原始数组

    var user = [
    { name: "张三", js: 80 },
    { name: "李四", js: 90 },
    { name: "王麻子", js: 40 }
    ]
    const res = user.every(item => {
    return item.js >= 60
    })
    console.log(res ? "全部及格" : '有同学不及格');//有同学不及格

    some()方法检测数组中的元素是否满足指定条件

    some() 方法会依次执行数组的每个元素

    ● 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
    ● 如果没有满足条件的元素,则返回false。

    注意: some() 不会对空数组进行检测。

    注意: some() 不会改变原始数组。

    var ages = [3, 10, 18, 20];
    let res = ages.some(item => {
    return item > 10
    })
    console.log(res);//true

    var ages = [3, 10, 18, 20];
    let res = ages.some(item => {
    return item > 100
    })
    console.log(res);//false

    filter() 过滤

    注意:filter删选所有满足条配件的,find返回第一个满足条件的

    注意: filter() 不会对空数组进行检测。

    注意: filter() 不会改变原始数组。

    let lesson = [
    { name: "张三", age: 13 },
    { name: "里斯", age: 13 },
    { name: "王麻子", age: 14 }
    ]
    const res = lesson.filter(item => {
    return item.age == 13
    })
    console.log(res);
    //0: {name: '张三', age: 13}
    1: {name: '里斯', age: 13}

    map() 映射

    注意: map() 不会对空数组进行检测。

    注意: map() 不会改变原始数组。

    值类型不会改变原数组,引用类型会改变原数组因为是吧地址拿过去了

    值类型

    let arr = ['js', 'php', 'html']
    const res = arr.map(item => {
    return item = ${item}入门到放弃
    })
    console.log(res);// ['js入门到放弃', 'php入门到放弃', 'html入门到放弃']
    console.log(arr);//['js', 'php', 'html']

    引用类型

    let lesson = [
    { name: "张三", age: 13 },
    { name: "里斯", age: 13 },
    { name: "王麻子", age: 14 }
    ]
    lesson.map(item => {
    return item.sex = '男'

        })
    
        console.log(lesson);
    

    //输出结果 改变原数组了
    0: {name: '张三', age: 13, sex: '男'}
    1: {name: '里斯', age: 13, sex: '男'}
    2: {name: '王麻子', age: 14, sex: '男'}

    引用类型 浅拷贝方法

    let lesson = [
    { name: "张三", age: 13 },
    { name: "里斯", age: 13 },
    { name: "王麻子", age: 14 }
    ]
    const res = lesson.map(item => {
    return Object.assign({ sex: '男' },item)
    })
    console.log(res);
    // res输出结果
    0: {sex: '男', name: '张三', age: 13}
    1: {sex: '男', name: '里斯', age: 13}
    2: {sex: '男', name: '王麻子', age: 14}
    console.log(lesson);
    //lesson输出结果
    0: {name: '张三', age: 13}
    1: {name: '里斯', age: 13}
    2: {name: '王麻子', age: 14}

    Object.entries 可以将对象转换为二维数组

    let hd = {
    name: '你好啊',
    year: 12312
    }
    console.log(Object.entries(hd));

    [

    [
        "name",
        "你好啊"
    ],
    [
        "year",
        12312
    ]
    

    ]

    记录一:扁平化 n 维数组

    [1, [2, 3]].flat(2); // [1, 2, 3]
    [1, [2, 3, [4, 5]]].flat(3); // [1, 2, 3, 4, 5]

    Array.flat(n) 是 ES10 扁平化数组的 api, n 表示维度, n 值为 Infiniti 时维度为无限大。
    js 实现:利用递归和数组合并方法 concat 实现扁平
    function flatten(arr) {
    while(arr.some(item => Array.isArray(item))) {
    arr = [].concat(...arr);
    }
    return arr;
    }
    flatten([1, [2, 3]]); // [1, 2, 3]

    记录二:去重

    let arr = [1,2,3,4,1,2,3,4]
    Array.from(new Set(arr)); // [1, 2, 3, 4]
    [...new Set(arr)]; // [1, 2, 3, 4]

    Set 是 ES6 新出来的一种定义不重复数组的数据类型。
    Array.from 是将类数组转化为数组。
    … 是扩展运算符,将 set 里面的值转化为字符串。

    ● js 实现:可以根据双层循环过滤掉重复项。

    Array.prototype.distinct = function () {
    var arr = this,
    result = [],
    i,
    j,
    len = arr.length;
    for (i = 0; i < len; i++) {
    for (j = i + 1; j < len; j++) {
    if (arr[i] === arr[j]) {
    j = ++i;
    }
    }
    result.push(arr[i]);
    }
    return result;
    };
    [1, 2, 2, 3].distinct(); // [1, 2, 3];

    记录三:排序

    [1, 2, 3, 4].sort(); // [1, 2, 3, 4] 默认是升序
    [1, 2, 3, 4].sort((a, b) => b - a); // [4, 3, 2, 1]
    sort 是 js 内置的排序方法,参数为一个函数

    ● js 实现:冒泡排序

    Array.prototype.bubleSort = function () {
    let arr = this,
    len = arr.length;
    for (let i = 0; i < len; i++) {
    for (let j = i + 1; j < len; j++) {
    if (arr[j - 1] > arr[j]) {
    [arr[j - 1], arr[j]] = [arr[j], arr[j - 1]];
    }
    }
    }
    return arr;
    }[(2, 1, 3)].bubleSort(); // [1, 2, 3]

    记录四:最大值

    Math.max(...[1, 2, 3, 4]); // 4
    Math.max.apply(this, [1, 2, 3, 4]); // 4
    [1, 2, 3, 4].reduce((prev, cur, curIndex, arr) => {
    return Math.max(prev, cur);
    }); // 4

    记录五:求和

    [1, 2, 3, 4].reduce((prev, cur, curIndex, arr) => {
    return prev + cur;
    }, 0); // 10

    记录六:合并

    var a = [1, 2, 3, 4];
    var b = [5, 6];
    a.concat(b); // [1, 2, 3, 4, 5, 6]
    [...a, ...b]; // [1, 2, 3, 4, 5, 6]
    [].push.apply(a, b); // [1, 2, 3, 4, 5, 6]
    b.map((item) => {
    a.push(item);
    }); // [1, 2, 3, 4, 5, 6]

    记录七:判断是否包含

    [1, 2, 3].includes(4); // false
    [1, 2, 3].indexOf(4); // -1 表示没有
    [1, 2, 3].find(item => item === 3); // 3 如果没有返回 undefined
    [1, 2, 3].findIndex(item => item === 3); // 2 如果没有则返回 -1

    includes(), find(), findIndex() 是 ES6 的 api。

    记录八:类数组转换

    类数组:表示有 length 属性,但是不具备数组的方法。

    Array.prototype.slice.call(arguments); // arguments 是类数组(伪数组)
    Array.prototype.slice.apply(arguments);
    Array.from(arguments);
    [...arguments];

    // 可运行示例
    function a () {
    return [...arguments];
    }
    a(1, 2); // array

    Array.from({ length: 9 }, () => 0); // [0, 0, 0, 0, 0, 0, 0, 0, 0]

    // document.querySelectorAll('.color'); 返回的也是类数组
    var targets = document.querySelectorAll('.color');
    [].forEach.apply(targets, function(item){
    // do something.
    });

    // slice 实现
    Array.prototype.slice = function(start, end) {
    var result = new Array();
    start = start || 0;
    end = end || this.length;
    for(var i = start; i < end; i ++){
    result.push(this[i]);
    }
    return result;
    }

    call、apply:改变 slice 里面的 this 指向 arguments, 所以 arguments 也可以调用数组的方法。
    Array.from: 将类数组或可迭代对象创建为数组。
    … 将数组扩展为字符串,再定义为数组。

    记录九:每项设置值

    [1, 2, 3].fill(false); // [false, false, false]
    Array.from({ length: 9 }, () => 0); // [0, 0, 0, 0, 0, 0, 0, 0, 0]

    fill 是 ES6 的方法。

    记录十:单项处理

    // every 每项都满足返回 true
    [1, 2, 3].every(item => { return item > 2 }); // false

    // 有一项满足返回 true
    [1, 2, 3].some(item => { return item > 2 }); // true

    // 数组过滤
    [1, 2, 3].filter(item => { return item > 2 }); // [3]

    some、every、filter 是 ES5 的 api。

    记录十一:对象、数组转化

    Object.keys({ name: "zhangsan", age: 14 }); // ["name", "age"]
    Object.values({ name: "zhangsan", age: 14 }); // ["zhangsan", 14]
    Object.entries(["zhangsan", 14]); // [["name", "zhangsan"], ["age", 14]]
    Object.fromEntries(["name", "zhangsan"], ["age", 14]); // ES10 的 api,Chrome 不支持,firebox 输出 { "name": "张三", "age": 14 }

    slice 数组中提取指定的元素

    slice从数组中提取指定的元素 该方法不会改变原数组 返回新数组

    参数1截取开始位置的索引,包含结束索引

    参数2截取结束位置的索引,不好含结束索引

    第二个参数可以不写,此时截取从开始索引及往后的所有元素

            var arr = [1, 23, 56, 7, 8, 12]
            var res = arr.slice(1, 4)
            console.log(res);//(3) [23, 56, 7]
    

    splice 删除元素,并向数组添加新元素

    可以删除数组中指定的元素 会影响原数组 会将指定的元素从原数组中删除 并将删除的元素作为返回值

    参数1开始位置的索引

    参数2表示删除的数量

    参数3及以后可传递新的元素,元素会插入到开始位置的前面

      var arr = [1, 23, 56, 7, 8, 12]
      arr.splice(1, 4)
      console.log(arr);// [1, 12]
    

    concat 连接两个或多个数组,并返回结果

    concat()可以连接两个或多个数组,并将新的数组返回

    不会改变原数组

            var arr1 = [1, 2, 3]
            var arr2 = [4, 5, 6]
            var arr3 = arr1.concat(arr2)
            console.log(arr3);//[1, 2, 3, 4, 5, 6]
    

    join 数组转字符串

    数组转字符串,不会改变原数组 将字符串返回

    在join()中指定一个字符串作为参数,这个字符串会成为连接符

    不指定连接符,默认使用 逗号作为连接符

      var arr1 = [1, 2, 3]
            var arr2 = arr1.join()
            console.log(arr2);//1,2,3
    

    reverse 反转数组

    会修改原数组

        var arr1 = [1, 2, 3]
            arr1.reverse()
            console.log(arr1);// [3, 2, 1]
    

    sort 排序

    会改变原数组

    a - b 升序

    b - a 降序

       var arr1 = [1, 2, 3]
            arr1.sort((a, b) => b - a)
            console.log(arr1);//[3, 2, 1]
    

    Array.of 默认值

    var arr = Array.of(100)
     console.log(arr)//100
     console.log(arr.length)// 1
    

    Array.fill填充默认值

    var arr = Array(100) //此时是100个空 length是100
    var arr = Array(10).fill(0) // 此时是10个0
    

    字符串转数组的几种方法

    方法一
    var  str = "hello,word"
    var arr = str.split(",")//['hello', 'word']
    
    方法二  具有length属性才可以转化
    from可以将伪数组转化为真实数组
    var obj = {
        0:"张三",
        1:18,
        length:2
    }
    console.log(Array.from(obj)) // ['张三', 18]
    

    indexOf()查找元素

    var arr = [1,2,3,4]
    arr.indexOf(3) // 返回索引2
    
    var arr = [1,2,3,4,"5"]
    arr.indexOf(5) // 返回-1  查找不到返回-1 严格类型查找
    
    var arr = [5,1,2,3,4,5]
    arr.indexOf(5,1) //5  arr.indexOf(要查找的元素,查找的起始位置(索引))
    

    find 查找元素,把元素返回,适合引用 数据类型

    let lessons = [{ name: "js" }, { name: "css" }, { name: "java" }]
        let status = lessons.find(item => item.name === "js")
            console.log(status);//{name: 'js'}
    

    findIndex查找元素,把元素索引位置返回

    let lessons = [{ name: "js" }, { name: "css" }, { name: "java" }]
        let status = lessons.findIndex(item => item.name === "js")
            console.log(status);//0
    

    every 监测数组所有元素是否符合条件

    • 如果数组中检测到有一个元素不满足,则整个表达式返回 false ,且剩余的元素不会再进行检测。

    • 如果所有元素都满足条件,则返回 true。

    • 注意: every() 不会对空数组进行检测。
      注意: every() 不会改变原始数组

      var user = [
                { name: "张三", js: 80 },
                { name: "李四", js: 90 },
                { name: "王麻子", js: 40 }
            ]
            const res = user.every(item => {
                return item.js >= 60
            })
            console.log(res ? "全部及格" : '有同学不及格');//有同学不及格
      

    some()方法检测数组中的元素是否满足指定条件

    some() 方法会依次执行数组的每个元素

    • 如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
    • 如果没有满足条件的元素,则返回false。

    注意: some() 不会对空数组进行检测。

    注意: some() 不会改变原始数组。

      var ages = [3, 10, 18, 20];
            let res = ages.some(item => {
                return item > 10
            })
            console.log(res);//true
    
    
       var ages = [3, 10, 18, 20];
            let res = ages.some(item => {
                return item > 100
            })
            console.log(res);//false
    

    filter() 过滤

    注意:filter删选所有满足条配件的,find返回第一个满足条件的

    注意: filter() 不会对空数组进行检测。

    注意: filter() 不会改变原始数组。

      let lesson = [
                { name: "张三", age: 13 },
                { name: "里斯", age: 13 },
                { name: "王麻子", age: 14 }
            ]
            const res = lesson.filter(item => {
                return item.age == 13
            })
            console.log(res);
    //0: {name: '张三', age: 13}
      1: {name: '里斯', age: 13}
    

    map() 映射

    注意: map() 不会对空数组进行检测。

    注意: map() 不会改变原始数组。

    值类型不会改变原数组,引用类型会改变原数组因为是吧地址拿过去了

    #值类型 
    let arr = ['js', 'php', 'html']
            const res = arr.map(item => {
                return item = `${item}入门到放弃`
            })
            console.log(res);// ['js入门到放弃', 'php入门到放弃', 'html入门到放弃']
            console.log(arr);//['js', 'php', 'html']
    
    
    #引用类型
     let lesson = [
                { name: "张三", age: 13 },
                { name: "里斯", age: 13 },
                { name: "王麻子", age: 14 }
            ]
            lesson.map(item => {
                return item.sex = '男'
    
            })
        
            console.log(lesson);
    //输出结果 改变原数组了
    0: {name: '张三', age: 13, sex: '男'}
    1: {name: '里斯', age: 13, sex: '男'}
    2: {name: '王麻子', age: 14, sex: '男'}
    
    #引用类型 浅拷贝方法
       let lesson = [
                { name: "张三", age: 13 },
                { name: "里斯", age: 13 },
                { name: "王麻子", age: 14 }
            ]
            const res = lesson.map(item => {
              return  Object.assign({ sex: '男' },item)
            })
            console.log(res);
    // res输出结果
    0: {sex: '男', name: '张三', age: 13}
    1: {sex: '男', name: '里斯', age: 13}
    2: {sex: '男', name: '王麻子', age: 14}
            console.log(lesson);
    //lesson输出结果
    0: {name: '张三', age: 13}
    1: {name: '里斯', age: 13}
    2: {name: '王麻子', age: 14}
    

    Object.entries 可以将对象转换为二维数组

     let hd = {
          name: '你好啊',
          year: 12312
        }
     console.log(Object.entries(hd));
    
    #[
        [
            "name",
            "你好啊"
        ],
        [
            "year",
            12312
        ]
    ]
    

    浅拷贝的几种方法[浅拷贝不能深层次拷贝]

    let hd = {
          name: '你好啊',
          year: 12312
        }
    
        // 浅拷贝的几种方法
        let obj = { ...hd }
        obj.name = '132'
        console.log(obj);//{name: '132', year: 12312}
        console.log(hd);//{name: '你好啊', year: 12312}
    方法2
    
       let obj = Object.assign({}, hd)
        obj.name = 'hello'
        console.log(obj);//{name: 'hello', year: 12312}
        console.log(hd);//{name: '你好啊', year: 12312}
    

    深拷贝

     案例1
     let hd = {
          name: 'hello',
          year: 999,
          user: {
            name: "word"
          }
        }
    
        function copy(object) {
          let res = {}
          for (const key in object) {
            res[key] = typeof object[key] == 'object' ? copy(object[key]) : object[key]
          }
          return res
        }
    
        let data = copy(hd)
        data.user.name = 'hello word'
        console.log(JSON.stringify(data, null, 2));
        console.log(JSON.stringify(hd, null, 2));
    
    /*
    {
      "name": "hello",
      "year": 999,
      "user": {
        "name": "hello word"
      }
    }
    index.html:34 {
      "name": "hello",
      "year": 999,
      "user": {
        "name": "word"
      }
    }
    */
    案例2
     let hd = {
          name: 'hello',
          year: 999,
          user: {
            name: "word"
          },
          arr: [123, 456]
        }
        function copy(object) {
          let res = object instanceof Array ? [] : {}
          for (const [k,v] of Object.entries(object)) {
            res[k] = typeof v== 'object' ? copy(v) : v
          }
          return res
        }
        let data = copy(hd)
        data.arr.push(789)
        console.log(JSON.stringify(data, null, 2));
        console.log(JSON.stringify(hd, null, 2));
    /*
    {
      "name": "hello",
      "year": 999,
      "user": {
        "name": "word"
      },
      "arr": [
        123,
        456,
        789
      ]
    }
    index.html:54 {
      "name": "hello",
      "year": 999,
      "user": {
        "name": "word"
      },
      "arr": [
        123,
        456
      ]
    }
    */
    

    使用闭包 实现区间筛选

      var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
            function between(a, b) {
                return function (v) {
                    return v > 2 && v < 7
                }
            }
            console.log(arr.filter(between(2, 7)));
    

    方法2

        var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
         var a = arr.filter(item => {
                 if (item > 2 && item < 7) return item
            })
            console.log(a);
    

    相关文章

      网友评论

          本文标题:ES6+ 数组字符串操作

          本文链接:https://www.haomeiwen.com/subject/wwzgfrtx.html