用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等等啥的,你要有个清晰的认知,不能混淆

posted @ 2017-09-09 00:21  阿柴与米  阅读(3001)  评论(0编辑  收藏  举报