• 用js实现数组的转置


    遇见一个题目,如下

    var obj = {
      a: [1, 2, 3],
      b: [4, 5, 6],
      c: [7, 8]
    };
    spiltGroup(obj); // [[1,4,7],[2,5,8],[3,6]]

    这个相当于是实现一个转置的功能,但是又还是存在区别的先来看看数组的转置

    var arr1=[
      [1,2,3],
      [4,5,6],
      [7,8,9]
    ]
    var arr2=[
      [1,4,7],
      [2,5,8],
      [3,6,9]
    ]

    这两个题目的区别,大家应该看到了,数组的转置,这个算是很简单的,应该这个数组,每一行的位数是一样的,要么是个正方形的数组,要么是个长方形的数组 
    但是看看第一个题目,每一行的数组的位数,是不一样的。 
    先来看看数组的转置,从思路分析,到底遇到这种问题,该如何去着手 
    第一步:我们需要创建一个新的数组,这个数组的元素还是数组,我们要知道这个数组,有多少个元素

    var arr1=[
      [1,2,3],
      [4,5,6],
      [7,8,9]
    ]
    var arr2
    for(var i=0;i<arr[0].length;i++){
      arr2[i]=[]
    }
    console.log(arr2)// [ [],[],[] ]

    因为数组的每一行都是相同的,所以我们直接可以取到arr[0]的长度,即可 
    第二步:我们循环一次,输出每一行数组,然后再循环一次,找出数组每一行的东西。行列交换

    for (var i = 0; i < arr.length; i++) {
      for (var j = 0; j < arr[i].length; j++) {
         arr2[j][i] = arr[i][j];
      }
    }

    也是数组的转置的写法,蛮新奇的

    var arr = [
      [2, 4, 6],
      [8, 9, 0],
      [9, 6, 2]
    ];
    var newArray = arr[0].map(function(col, i) {
      return arr.map(function(row) {
        return row[i];
      })
    });
    console.log(newArray)

    这个方法很简洁,这个具体也说不出来,自己去运行,把每一步打印出来,就知道是什么回事了

    再来整整第一个题目,由于他不是严格意义上的数组,因此,以上两种方法是不适合的,我仿照第二种的写法,最后实现了这功能

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Document</title>
    </head> 
    <body>
    <script type="text/javascript">
    var obj = {  
      a: [1, 2, 3],
      b: [4, 5, 6, 7,8,8],
      c: [7, 8]
    }; 
    function spiltGroup(obj) {
      var arr = []
      var arr2 = []
      var arr3 = []
      for (var key in obj) {
        arr.push(obj[key])
      }
      arr.forEach(function(item){
      arr2.push(item.length)
    })
    var maxLen = Math.max(...arr2)
    for (var i = 0; i < maxLen; i++) {
      arr3.push(undefined)
    }
    if (arr[0].length < maxLen) {
      arr[0] = arr[0].concat(arr3).slice(0, maxLen)
    }
    var result = arr[0].map(function(col, i) {    
      return arr.map(function(row) {    
        return row[i]
      })
    });
    result = result.map(function(item) {
      return item.filter(function(i) {
          return i != undefined
        })
      })
      return result 
    }
    var result = spiltGroup(obj)
    result.forEach(function(i) {
      console.log(i)
    })
    </script>
    </body> 
    </html>
     

    总结:最大的感受就是,数组的一些方法,一定要是非常的熟悉,而且,当这些方法的嵌套层次比较深的时候,比如说,先用map,再用filter等等啥的,你要有个清晰的认知,不能混淆

  • 相关阅读:
    Python爬虫进阶五之多线程的用法
    Python爬虫进阶四之PySpider的用法
    Python爬虫进阶三之Scrapy框架安装配置
    Python爬虫进阶二之PySpider框架安装配置
    Python爬虫进阶一之爬虫框架概述
    Python爬虫利器六之PyQuery的用法
    Python爬虫利器五之Selenium的用法
    Python爬虫利器四之PhantomJS的用法
    Python爬虫利器三之Xpath语法与lxml库的用法
    Python爬虫利器二之Beautiful Soup的用法
  • 原文地址:https://www.cnblogs.com/yiyistar/p/7496932.html
Copyright © 2020-2023  润新知