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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM